BZOJ1002
1002: [FJOI2007]轮状病毒
Description
给定n(N<=100),编程计算有多少个不同的n轮状病毒。
Input
第一行有1个正整数n。
Output
将编程计算出的不同的n轮状病毒数输出
Sample Input
3
Sample Output
16
----------------------------->_<------------------------------
仔细推规律可以发现本题有递推式(基尔霍夫矩阵)
F[i]=3*f[i-1]-f[i-2]+2;
F[1]=1 f[2]=5(By Vfk OrzOrz)
注意高精
1 #include<iostream> 2 #include<stdlib.h> 3 #include<stdio.h> 4 #include<math.h> 5 #include<algorithm> 6 #include<vector> 7 #include<queue> 8 using namespace std; 9 int n; 10 struct gj 11 { 12 int b[1501]; 13 int cd; 14 gj(){for(int i=1;i<=n;i++)b[i]=0;cd=0;} 15 }f[151]; 16 gj operator *(int a,gj b) 17 { 18 gj c=gj(); 19 for(int i=1;i<=b.cd;i++) 20 {c.b[i+1]=(c.b[i]+b.b[i]*a)/10;c.b[i]=(c.b[i]+b.b[i]*a)%10;} 21 if(c.b[b.cd+1]>0)c.cd=b.cd+1; 22 else c.cd=b.cd; 23 return c; 24 } 25 gj operator -(gj a,gj b) 26 { 27 gj c=gj(); 28 for(int i=1;i<=a.cd;i++) 29 { 30 c.b[i]+=a.b[i]-b.b[i]; 31 if(c.b[i]<0) 32 {c.b[i]+=10;c.b[i+1]=-1;} 33 } 34 for(int i=a.cd;i>=1;i--) 35 if(c.b[i]!=0) 36 {c.cd=i;break;} 37 return c; 38 } 39 gj operator +(gj a,int b) 40 { 41 gj c=gj(); 42 a.b[1]+=b; 43 for(int i=1;i<=a.cd;i++) 44 { 45 c.b[i+1]=(c.b[i]+a.b[i])/10; 46 c.b[i]=(c.b[i]+a.b[i])%10; 47 } 48 if(c.b[a.cd+1]>0)c.cd=a.cd+1; 49 else c.cd=a.cd; 50 return c; 51 } 52 void init() 53 { 54 scanf("%d",&n); 55 f[1].b[1]=1;f[2].b[1]=5; 56 f[1].cd=1;f[2].cd=1; 57 for(int i=3;i<=n;i++) 58 f[i]=3*f[i-1]-f[i-2]+2; 59 //f[n]=3*f[n-1]-f[n-2]+2; 60 //for(int i=f[n-2].cd;i>=1;i--) 61 //cout<<f[n-2].b[i]; 62 //cout<<endl; 63 //for(int i=f[n-1].cd;i>=1;i--) 64 //cout<<f[n-1].b[i]; 65 // cout<<endl; 66 for(int i=f[n].cd;i>=1;i--) 67 cout<<f[n].b[i]; 68 cout<<endl; 69 } 70 int main() 71 { 72 //freopen("1002.out","r",stdin); 73 init(); 74 return 0; 75 }