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

来源:互联网 发布:手机数据流量自动关闭 编辑:程序博客网 时间:2024/06/16 14:45

原题链接

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 1000005using 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;}


0 0
原创粉丝点击