程序员人生 网站导航

BZOJ 1211 HNOI2004 树的计数 Prufer序列

栏目:互联网时间:2014-11-19 08:18:59

题目大意:给定1棵树中所有点的度数,求有多少种可能的树

Prufer序列,具体参考[HNOI2008]明明的烦恼

直接乘会爆long long,所以先把每一个数分解质因数,把质因数的次数相加相减,然后再乘起来

注意此题无解需要输出0

当n!=1&&d[i]==0时 输出0

当Σ(d[i]⑴)!=n⑵时输出0

写代码各种脑残……竟然直接算了n⑵没用阶乘……

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 160 using namespace std; typedef long long ll; int n,sum,d[M]; int cnt[M]; ll ans=1; ll Quick_Power(ll x,int y) { ll re=1; while(y) { if(y&1)re*=x; x*=x; y>>=1; } return re; } void Decomposition(int x,int flag) { int i; for(i=2;i*i<=x;i++) while(x%i==0) cnt[i]+=flag,x/=i; if(x^1) cnt[x]+=flag; } int main() { int i,j; cin>>n; for(i=2;i<=n⑵;i++) Decomposition(i,1); for(i=1;i<=n;i++) { scanf("%d",&d[i]); if(!d[i]&&n!=1) { puts("0"); return 0; } sum+=d[i]⑴; for(j=2;j<=d[i]⑴;j++) Decomposition(j,⑴); } if(sum!=n⑵) { puts("0"); return 0; } for(i=1;i<=n⑵;i++) if(cnt[i]) ans*=Quick_Power(i,cnt[i]); cout<<ans<<endl; }


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐