bzoj1211: [HNOI2004]树的计数

来源:互联网 发布:里见浩太朗 知乎 编辑:程序博客网 时间:2024/06/05 11:19

传送门
Prufer序列,具体参考[HNOI2008]明明的烦恼
直接乘会爆long long,所以先把每个数分解质因数,把质因数的次数相加相减,然后再乘起来
注意此题无解需要输出0
当n!=1&&d[i]==0时 输出0
当Σ(d[i]-1)!=n-2时输出0

#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#include<queue>#define ll long longusing namespace std;ll ans;int n,x,sum,a[155];inline void chai(int x,int y){    for (int i=2;i*i<=x;i++)        while (x%i==0){            x/=i;            a[i]+=y;        }    if (x!=1) a[x]+=y;}void la(){puts("0"); exit(0);}int main(){    scanf("%d",&n);    for (int i=2;i<n-1;i++) chai(i,1);    for (int i=1;i<=n;i++){        scanf("%d",&x);        if (x==0&&n!=1) la();        sum+=x-1;        for (int j=2;j<x;j++) chai(j,-1);    }    if (sum!=n-2) la();    ans=1;    for (int i=2;i<=n;i++)        for (int j=1;j<=a[i];j++) ans*=(ll)i;     printf("%lld",ans);    return 0;}
0 0