因为在每个数只能有二进制构成  即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\n",dp[n]);
    }
    return 0;
}

 

posted on 2017-04-18 09:38  云胡不喜。  阅读(244)  评论(0编辑  收藏  举报