zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    luoguP3822 [NOI2017]整数
    luoguP2150 [NOI2015]寿司晚宴
    luoguP3868 [TJOI2009]猜数字
    luoguP4777 【模板】扩展中国剩余定理(EXCRT)
    luoguP2048 超级钢琴
    题解 P1004 【方格取数】
    戊戌年西安游记
    题解 P4388 【付公主的矩形】
    题解 P4277 【河城荷取的烟花】
    001 dynamic Linq
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/11811493.html
Copyright © 2011-2022 走看看