【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度
生活随笔
收集整理的這篇文章主要介紹了
【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
給定n(N<=100),編程計算有多少個不同的n輪狀病毒。
Input
第一行有1個正整數n。
Output
將編程計算出的不同的n輪狀病毒數輸出
Sample Input
3Sample Output
16HINT
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?
轉載于:https://www.cnblogs.com/DMoon/p/5247765.html
總結
以上是生活随笔為你收集整理的【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一周学习进度表
- 下一篇: 小程序--显示图形效果