【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度

Description

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

Input

第一行有1个正整数n。

Output

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

Sample Input

3

Sample Output

16

HINT

 

Source

Solution:推导不会,看不懂,知道了公式f[i]=f[i-1]*3-f[i-2]+2;要加高精度然后水过,可以打表找规律,不太会打。。。找规律,VFK的推导清晰全过程

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 struct data{int a[101],len;}f[101];
 5 int n;
 6 data gjc(data a,int k)
 7 {
 8     for (int i=1;i<=a.len;i++)    a.a[i]*=k;
 9     for (int i=1;i<=a.len;i++)
10     {
11         a.a[i+1]+=a.a[i]/10;
12         a.a[i]%=10;
13     }
14     if (a.a[a.len+1]!=0)    a.len++;
15     return a;
16 }
17 
18 data gjj(data a,data b)
19 {
20     a.a[1]+=2;
21     int j=1;
22     while (a.a[j]>=10)
23     {
24         a.a[j]%=10;
25         a.a[j+1]++;        
26         j++;
27     }
28     if (a.a[a.len+1]!=0) a.len++;
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 
38 int main()
39 {
40     scanf("%d",&n);
41     f[1].a[1]=1;f[2].a[1]=5;
42     f[1].len=f[2].len=1;
43     for (int i=3;i<=n;i++)
44         f[i]=gjj(gjc(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     return 0;
48 }
View Code

 

posted @ 2016-03-06 16:24  DMoon  阅读(227)  评论(0编辑  收藏  举报