BZOJ P1002 [FJOI2007] 轮状病毒【线性递推】【高精度模拟】

这道题虽然是线性递推…..我也就是多写了几个 n 轮状病毒的个数….然后找规律……

i 轮状病毒的个数为 f [ i ] ,不难找到的规律:

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;
}

猜你喜欢

转载自blog.csdn.net/yanzhenhuai/article/details/81161217