这道题虽然是线性递推…..我也就是多写了几个 n n 轮状病毒的个数….然后找规律……
设轮状病毒的个数为
f[i]
f
[
i
]
,不难找到的规律:
f[i]=f[i−1]∗3+2−f[i−2]
f
[
i
]
=
f
[
i
−
1
]
∗
3
+
2
−
f
[
i
−
2
]
然后高精度模拟一下就好了。
参考代码:
#include <cstdio>
const int Max=1e2+5;
struct Node{
int Length,W[Max];
}F[Max];int N;
Node Mul(Node A){
int I,J;
for(I=1;I<=A.Length;I++){
A.W[I]*=3;
}
for(I=1;I<=A.Length;I++){
A.W[I+1]+=A.W[I]/10;A.W[I]%=10;
}
if(A.W[A.Length+1]!=0){
A.Length++;
}
return A;
}
Node Sub(Node A,Node B){
int I,J;
for(I=1;I<=A.Length;I++){
A.W[I]-=B.W[I];
if(A.W[I]<0){
A.W[I]+=10;A.W[I+1]--;
}
}
while(A.W[A.Length]==0){
A.Length--;
}
return A;
}
Node Plus(Node A){
int I=1;
A.W[1]+=2;
while(A.W[I]>=10){
A.W[I]%=10;A.W[++I]++;
}
return A;
}
int main(){
int I,J;scanf("%d",&N);
F[1].W[1]=1;F[1].Length=1;
F[2].W[1]=5;F[2].Length=1;
for(I=3;I<=N;I++){
F[I]=Sub(Plus(Mul(F[I-1])),F[I-2]);
}
for(I=F[N].Length;I>0;I--){
printf("%d",F[N].W[I]);
}
return 0;
}