将n划分成2的幂,有多少种划分方法

解析:当n是奇数时,只是每种情况比n-1多了一个1
当n是偶数时,包含一的情况是n-1多了一个1
不含1 的情况就是n/2的情况数,因为n拆分出所有的数字都是2的倍数,只需要将每种拆分结果中的数字都除以2就会与n/2的一种拆分相对应。

#include<cstdio>
const int N=1e7+10;
const int mod=1e9+7;
int s[N];
void solve()
{
    s[1]=1;
    for(int i=2;i<=N;i++)
    {
        if(i%2) s[i]=s[i-1];
        else
            s[i]=(s[i-1]+s[i/2])%mod;
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n;
    solve();
    while(~scanf("%d",&n))
    printf("%d\n",s[n]);
    return 0;
}

posted @ 2018-08-02 09:29  ffgcc  阅读(286)  评论(0编辑  收藏  举报