bzoj 1002 FJOI2007 轮状病毒

 给定n(N<=100),编程计算有多少个不同的n轮状病毒。

Input

第一行有1个正整数n。

Output

将编程计算出的不同的n轮状病毒数输出

Sample Input

3

Sample Output

16

代码

基尔霍夫矩阵(我也不知道是什么)推出f[i]=(f[i-1]*3-f[i-2]+2)

 

表示不会

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 struct data
 8 {
 9     int a[101],len;
10 };
11 int n;
12 data mul(data a,int k)
13 {
14     for(int i=1;i<=a.len;i++)
15         a.a[i]*=k;
16     for(int i=1;i<=a.len;i++)
17     {
18         a.a[i+1]+=a.a[i]/10;
19         a.a[i]%=10;
20     }
21     if(a.a[a.len+1]!=0) a.len++;
22     return a;
23 } 
24 data sub(data a,data b)
25 {
26     a.a[1]+=2;
27     int j=1;
28     while(a.a[j]>=10){a.a[j]%=10;a.a[j+1]++;j++;} 
29     for(int i=1;i<=a.len;i++)
30     {
31            a.a[i]-=b.a[i];
32            if(a.a[i]<0){a.a[i]+=10;a.a[i+1]--;}
33     }
34     while(a.a[a.len]==0)a.len--;
35     return a;
36 }
37 int main()
38 {
39     data f[101];
40     f[1].a[1]=1;f[2].a[1]=5;
41     f[1].len=f[2].len=1;
42     scanf("%d",&n);
43     for(int i=3;i<=n;i++)
44         f[i]=sub(mul(f[i-1],3),f[i-2]);
45     for(int i=f[n].len;i>0;i--)
46        printf("%d",f[n].a[i]);
47 }

 

posted @ 2017-09-26 21:27  Kaiser-  阅读(133)  评论(0编辑  收藏  举报