您的位置:首页 > 其它

51nod 1383 整数分解为2的幂【递推】

2017-10-24 07:55 344 查看

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
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: