luogu P2290 [HNOI2004]樹的計數
阿新 • • 發佈:2019-02-05
題意:
有n個點,每一個點的度分別為di,求可以組成的一棵無根樹的方案數。
思路:
prufer序列性質4的裸題。
有一些坑點:
[1]如果某一個點的度為0,並且不止一個點,一定無解(因為這樣子就會有一棵以上的樹,不符合題意)。
[2]如果不滿足prufer序列性質2,也無解。
程式碼:
#include<cstdio> #include<cmath> #include<algorithm> #define LL long long using namespace std; int n,ma=0; int d[200],a[1000000]; LL ans=1; void work(int x,int y) { int p=sqrt(x); for(int i=2;i<=p;i++) { while(!(x%i)) ma=max(ma,i),x/=i,a[i]+=y; if(x==1) return; } if(x!=1) ma=max(ma,x),a[x]+=y; } int main() { int sum=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&d[i]); if(n>1&&!d[i]) { printf("0"); return 0; } sum+=d[i]-1; } if(sum!=n-2) { printf("0"); return 0; } for(int i=1;i<=n-2;i++) work(i,1); for(int i=1;i<=n;i++) for(int j=1;j<d[i];j++) work(j,-1); for(int i=1;i<=ma;i++) ans*=pow(i,a[i]); printf("%lld",ans); }