【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 }
—Anime Otaku Save The World.