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;
}