因为在每个数只能有二进制构成 即5有21,101折两种方式 不同于2进制的方式为数字最大 可以为2
所以在末尾只有0,1,2 如果数字为奇数 末尾必定为1 所以我们理解为n/2*2+1即为这个数字
同理当为偶数时 n/2*2表示末尾为0 如果末尾为2即为(n-2)/2*2+2;
所以表达式 :
if(i%2) dp[i]=dp[i/2];
else dp[i]=dp[i/2]+dp[i/2-1];
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<vector> #include<math.h> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 10000009 LL dp[N]; int main() { dp[0]=1;dp[1]=1;dp[2]=2; for(int i=3;i<N;i++) { if(i%2) dp[i]=dp[i/2]; else dp[i]=dp[i/2]+dp[i/2-1]; } int T,n; scanf("%d",&T); while(T--) { scanf("%d",&n); printf("%lld ",dp[n]); } return 0; }