ZJNU 2204

我猜这个数列可以直接从大到小凑……

推出帕多瓦数列每一项,从大到小循环

遇到小于等于x的项就减掉这一项

全部循环完毕后判断x是否为0即可

#include<stdio.h>
typedef long long ll;
ll a1,a2,a3,d[50];
void cal(){
    ll a4=a2+a1;
    a1=a2;
    a2=a3;
    a3=a4;
}
int sc(ll x){
    int i=49;
    while(i&&x){
        if(d[i]<=x)
            x-=d[i];
        i--;
    }
    if(x)
        return 0;
    return 1;
}
int main(){
    int i,T;
    ll x;
    a1=a2=a3=1;
    d[0]=0;
    d[1]=a3;
    for(i=2;i<50;i++){
        cal();
        cal();
        cal();
        d[i]=a3;
    }
    scanf("%d",&T);
    while(T--){
        scanf("%lld",&x);
        printf((sc(x)?"Yes
":"No
"));
    }
    
    return 0;
}
原文地址:https://www.cnblogs.com/stelayuri/p/12236614.html