好妙呀。。。
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1005
Solution
写题解太。。麻烦了。。。
自行百度prufer吧。。。
一棵树刚好对应一条prufer编码。。。于是只用计算有多少种组合就好了。。。
注意数据很大要用高精度。。。
代码
#include<cstdio> #include<iostream> using namespace std; int c[1005],d[1005],cnt=0,n,sum; int ch[1005]; int h[100000]; void cheng(int num){ int tmp=0; for(int i=1;i<=h[0];i++){ h[i]=h[i]*num+tmp; tmp=0; if(h[i]>9){ tmp=h[i]/10; h[i]%=10; } } while(tmp>0){ h[0]++; h[h[0]]=tmp; tmp=0; if(h[h[0]]>9){ tmp=h[h[0]]/10; h[h[0]]%=10; } } } int main(){ int m=0,temp; scanf("%d",&n); if(n==1){ scanf("%d",&c[1]); if (c[1]==0||c[1]==-1) printf("1\n"); else printf("0\n"); return 0; } for(int i=1;i<=n;i++) scanf("%d",&c[i]); for(int i=1;i<=n;i++){ if(c[i]==0){printf("0\n");return 0;} if(c[i]!=-1){ d[++cnt]=c[i]-1; sum+=d[cnt]; } else m++; } if(n-2<sum){printf("0\n");return 0;} for(int i=1;i<=cnt;i++) for(int j=2;j<=d[i];j++){ temp=j; for(int k=2;k<=j&&temp!=1;k++) while(temp%k==0){ ch[k]--; temp/=k; } } for(int i=n-2-sum+1;i<=n-2;++i){ temp=i; for(int k=2;k<=i&&temp!=1;k++) while(temp%k==0){ ch[k]++; temp/=k; } } h[0]=1;h[1]=1; for(int i=1;i<=n;i++) while(ch[i]>0){ ch[i]--; cheng(i); } for(int i=1;i<=n-2-sum;i++) cheng(m); for(int i=h[0];i>=1;i--) printf("%d",h[i]); printf("\n"); return 0; }
This passage is made by Yukino.
时间: 2024-10-09 21:29:36