数论训练之五

https://www.luogu.org/problem/P4430

题目大意:

求n个点生成树有多少个不同的生成方式

分析:

根据定理:n个点的不同生成树的个数是nn-2

又因为要求生成方式还要不同

一个形态的生成树有(n-1)!个

所以答案就是n2×(n-1)!

code by wzxbeliever:

#include<bits/stdc++.h>
#define ll long long
#define il inline
#define ri register int
#define lowbit(x) x&(-x)
using namespace std;
const int mod=9999991;
il ll fast_mi(int a,int b){
	ll res=1;
	while(b){
	 if(b&1)res=res*a%mod;
	 b>>=1;a=1ll*a*a%mod;
	}
	return res;
}
int n;
ll ans;
int main(){
	scanf("%d",&n);ans=1;
	for(ri i=1;i<=n-1;i++)ans=ans*i%mod;
	ans=ans*fast_mi(n,n-2)%mod;
	printf("%lld",ans);
	return 0;
}

https://www.luogu.org/problem/P4981

分析:

很简单的一个变式:

首先有个Nn-2,考虑每种形态都有n种可能每个点都当根

code by wzxbeliever:

#include<bits/stdc++.h>
#define ll long long
#define il inline
#define ri register int
#define lowbit(x) x&(-x)
using namespace std;
const int mod=1e9+9;
il ll fast_mi(int a,int b){
	ll res=1;
	while(b){
	 if(b&1)res=res*a%mod;
	 b>>=1;a=1ll*a*a%mod;
	}
	return res;
}
int n,T;
int main(){
	scanf("%d",&T);
	while(T--){
	scanf("%d",&n); 
	cout<<fast_mi(n,n-1)<<endl;	
	}
	return 0;
}
posted @ 2019-11-05 10:40  wzx_believer  阅读(128)  评论(0编辑  收藏  举报