51nod-1383 整數分解為2的冪
阿新 • • 發佈:2019-02-19
收藏
關注
任何正整數都能分解成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 = 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 1000000007Input示例
7Output示例
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; }