我猜这个数列可以直接从大到小凑……
推出帕多瓦数列每一项,从大到小循环
遇到小于等于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; }