[UVa 1646] Edge Case

UVa 1646

手动模拟一下,发现是一个广义斐波那契数列,\(F_1=1,F_2=3,F_n=F_{n-1}+F_{n-2}\)

证明,,,懒得证,,,

#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int width=4,base=1e4,MAXN=1e5+1;
int buf[MAXN];
struct BigInt{
    int s[MAXN],len;
    BigInt(){
        memset(s,0,sizeof(s));
        len=0;
    }
    BigInt operator = (const int& m){
        memset(s,0,sizeof(s));
        len=0;
        int n=m;
        if(!n) {
            s[len++]=n;
        } else {
            while(n){
                s[len++]=n%base;
                n/=base;
            }
        }
        return *this;
    }
};

void add(BigInt& a,BigInt& b,BigInt& c){
    memset(c.s,0,sizeof(c.s));
    c.len=0;
    int g=0;
    for(int i=0;;i++){
        if(i>=a.len && i>=b.len && !g) break;
        int x=g;
        if(i<a.len) x+=a.s[i];
        if(i<b.len) x+=b.s[i];
        c.s[c.len++]=x%base;
        g=x/base;
    }
    while(!c.s[c.len-1] && c.len>1) c.len--;
}
inline void scanf(BigInt& n){
    memset(n.s,0,sizeof(n.s));
    n.len=0;
    int x=getchar(),l=0;
    while(x<'0'||x>'9') x=getchar();
    while(x>='0'&&x<='9') {buf[l++]=x-'0';x=getchar();}

    int g=0;
    for(int i=l-1,j=1,k=1;i>=0;i--,j++){
        g=g+buf[i]*k;
        if(j%width==0 || i==0){
            n.s[n.len++]=g;
            g=0;k=1;
        } else {k*=10;}
    }
    while(!n.s[n.len-1] && n.len>1) n.len--;
}
inline void printf(BigInt& n){
    char buf[width+1];
    printf("%d",n.s[n.len-1]);
    for(int i=n.len-2;i>=0;i--) {
        sprintf(buf,"%04d",n.s[i]);
        printf("%s",buf);
    }
}
int main(){
    int n;
    while(scanf("%d",&n)==1) {
        BigInt s,t,ans;
        s=1;t=3;

    for(int i=3;i<=n;i++){
        add(s,t,ans);
            s=t;t=ans;
    }
    printf(ans);
        printf("\n");
    }
    return 0;
}

一次 AC ,不容易啊

猜你喜欢

转载自www.cnblogs.com/zhinv/p/9858468.html