[bzoj1089]严格n元树
设f[i]表示深度不超过i的方案数,那么有f[0]=1,$f[i]=f[i-1]^{n}+1$,然后用高精度即可(注意深度恰好为d还要用f[d]-f[d-1]才是答案)
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int a[1005]; 5 }a,s,ans; 6 int n,d; 7 void jia(){ 8 for(int i=1;i<=ans.a[0]+1;i++) 9 if (ans.a[i]==9)ans.a[i]=0; 10 else{ 11 ans.a[i]++; 12 ans.a[0]=max(ans.a[0],i); 13 break; 14 } 15 } 16 void jian(){ 17 for(int i=1;i<=ans.a[0];i++){ 18 if (s.a[i]>ans.a[i]){ 19 ans.a[i+1]--; 20 ans.a[i]+=10; 21 } 22 ans.a[i]-=s.a[i]; 23 } 24 while ((ans.a[0]>1)&&(!ans.a[ans.a[0]]))ans.a[0]--; 25 } 26 void cheng(){ 27 memset(a.a,0,sizeof(a.a)); 28 a.a[0]=ans.a[0]+s.a[0]-1; 29 for(int i=1;i<=s.a[0];i++) 30 for(int j=1;j<=ans.a[0];j++)a.a[i+j-1]+=s.a[i]*ans.a[j]; 31 ans=a; 32 for(int i=2;i<=ans.a[0];i++){ 33 ans.a[i]+=ans.a[i-1]/10; 34 ans.a[i-1]%=10; 35 } 36 while (ans.a[ans.a[0]]>9){ 37 ans.a[ans.a[0]+1]=ans.a[ans.a[0]]/10; 38 ans.a[ans.a[0]++]%=10; 39 } 40 } 41 int main(){ 42 scanf("%d%d",&n,&d); 43 ans.a[0]=ans.a[1]=1; 44 for(int i=1;i<=d;i++){ 45 s=ans; 46 for(int j=1;j<n;j++)cheng(); 47 jia(); 48 } 49 jian(); 50 for(int i=ans.a[0];i;i--)printf("%d",ans.a[i]); 51 }