Description
任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量!由于方案数量较大,输出Mod 1000000007的结果。
比如N = 7时,共有6种划分方法。
7=1+1+1+1+1+1+1
=1+1+1+1+1+2
=1+1+1+2+2
=1+2+2+2
=1+1+1+4
=1+2+4
题解
定义f[i]表示i的方案数,可以知道,每个数要么是从前一个数所有数都乘二转移来,要么就是从前一个数加一转移来,所以 f[i]=f[i−1]+f[i/2]∗(!(i&1))
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1000006
#define tt 1000000007
using namespace std;
int n,f[maxn];
int main(){
freopen("power.in","r",stdin);
freopen("power.out","w",stdout);
scanf("%d",&n);
f[0]=1;
for(int i=0;i<=log2(n);i++)
for(int j=1<<i;j<=n;j++)(f[j]+=f[j-(1<<i)])%=tt;
printf("%d\n",f[n]);
return 0;
}