51nod-1383 整数分解为2的幂

原题链接

基准时间限制:1 秒 空间限制:131072 KB 分值: 80  难度:5级算法题
 收藏
 关注
任何正整数都能分解成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
Input
输入一个数N(1 <= N <= 10^6)
Output
输出划分方法的数量Mod 1000000007
Input示例
7
Output示例
6
用dp[i][j]表示i分解成2的幂,其中最大的幂为1<<j,有多少种

#include <cstdio>
#include <cmath>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <queue>
#define MOD 1000000007
#define maxn 1000005
using namespace std;
typedef long long ll;

int dp[maxn][20];
int main(){
	
//	freopen("in.txt", "r", stdin);
	int n;
	scanf("%d", &n);
	for(int i = 0; i <= 19; i++){
	 dp[1][i] = 1;
	 dp[0][i] = 1;
    }
	for(int i = 2; i <= n; i++){
		for(int j = 0; (1<<j) <= i; j++){
		    (dp[i][j] += (ll)dp[i-(1<<j)][j]) %= MOD;;
		}
		for(int j = 1; j <= 19; j++)
		 (dp[i][j] += (ll)dp[i][j-1]) %= MOD;
	}
	cout << dp[n][19] << endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值