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 }

 

posted on 2015-06-15 14:44  diamonddd  阅读(118)  评论(0编辑  收藏  举报

导航