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

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

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

f[i]=f[i1]3+2f[i2] 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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值