[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 }
View Code

 

posted @ 2019-11-07 13:31  PYWBKTDA  阅读(99)  评论(0编辑  收藏  举报