Connect the Cable Wires UVA - 10862(大数+递推)

传送门

这个题是个递推题:

f0=1;

f1=3;

fi=3*f(i-1)-f(i-2);

使用大数,大数以1e16为一进制,最后注意输出格式,wa了4发抓狂

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

typedef long long LL;

const int maxn=2000;
const int n2=maxn/16;
const LL base=1e16;
LL fib[maxn+2][n2+2];

void setfib()
{
    fib[1][0]=1;
    fib[2][0]=3;
    int len=1;
    for(int i=3;i<=maxn;i++){
        int carry=0;
        for(int j=0;j<len;j++){
            fib[i][j]=3*fib[i-1][j]-fib[i-2][j]+carry;
            if(fib[i][j]<0){
                carry=-1;
                fib[i][j]+=base;
            }else{
                carry=fib[i][j]/base;
                fib[i][j]%=base;
            }
        }
        if(carry){
            fib[i][len++]=carry;
        }
    }
}

int main()
{
    memset(fib,0,sizeof(fib));
    setfib();
    int n;
    while(scanf("%d",&n)!=EOF&&n){
        int k=n2;
        while(fib[n][k]==0){
            k--;
        }
        printf("%lld",fib[n][k]);
        for(int i=k-1;i>=0;i--){
            printf("%016lld",fib[n][i]);//格式
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/80787149