JZOJ 1421. 二叉树
题目
Source / Author: COCI2008
分析
-
假设经过k个*号,构造出了3^k个不同的数。
下一位是L:每个数同时*2,即总和*2
下一位是R:每个数同时*2+1,即总和*2+1*数的个数(3^k)
下一位是*:从3^k个数变成3^(k+1)个数
其中3^k个数没有变化,总和*1
另外3^k个数加上了一个L,总和*2
还有3^k个数加上了一个R,每个数*2+1,即总和*2+1*数的个数(3^k)
综上,总和*5+3^k。
加个押位高精度就没了。
代码
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int N=1e4+10,mo=1e8; 6 char s[N]; 7 int f[N],p[N]; 8 long long ans=0; 9 void mul(int x) 10 { 11 for (int i=f[0];i>=1;i--) f[i]*=x,f[i+1]+=f[i]/mo,f[i]%=mo; 12 if (f[f[0]+1]) f[0]++; 13 } 14 void tmp() 15 { 16 for (int i=p[0];i>=1;i--) p[i]*=3,p[i+1]+=p[i]/mo,p[i]%=mo; 17 if (p[p[0]+1]) p[0]++; 18 } 19 void add() 20 { 21 for (int i=1;i<=max(p[0],f[0]);i++) f[i]+=p[i],f[i+1]+=f[i]/mo,f[i]%=mo; 22 if (f[f[0]+1]) f[0]++; 23 } 24 int main () 25 { 26 int len; 27 cin>>s+1; 28 len=strlen(s+1); 29 p[0]=p[1]=f[0]=f[1]=1; 30 for (int i=1;i<=len;i++) 31 { 32 if (s[i]=='L') mul(2); 33 else if (s[i]=='R') mul(2),add(); 34 else if (s[i]=='*') mul(5),add(),tmp(); 35 } 36 cout<<f[f[0]]; 37 for (int i=f[0]-1;i>=1;i--) printf("%08d",f[i]); 38 }
为何要逼自己长大,去闯不该闯的荒唐