题目描述
一个整数总可以拆分为2的幂的和,例如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1 总共有六种不同的拆分方式。 再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。 用f(n)表示n的不同拆分的种数,例如f(7)=6. 要求编写程序,读入n(不超过1000000),输出f(n)%1000000000。
输入描述:
每组输入包括一个整数:N(1<=N<=1000000)。
输出描述:
对于每组数据,输出f(n)%1000000000。
示例1
输入
7
输出
6
分析
把数都提前算出来,之后直接输出答案。
有规律,如果是奇数,那么前一个数是偶数,偶数的组合方式
代码
1 2 3 4 5 6 7 8 9 10 11 12 13
| void init(int dp[],int len){ dp[0]=0;dp[1]=1;dp[2]=2; for(int i = 3; i <= len; i ++) { dp[i] = 0; if(i&1) { dp[i] = (dp[i-1])%1000000000; } else { dp[i] = (dp[i-1]+dp[i/2])%1000000000; } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
void dfs(int n, int sum,int i,int len, int &cnt){ if(sum==n){ cnt=(cnt+1)%1000000000; return ; } for(; i <= len; i ++){ if(sum+pow(2,i)>n) return ; sum+=pow(2,i); dfs(n,sum,i,n-pow(2,i),cnt); sum-=pow(2,i); } }
int solution(int n){ int ans =0; dfs(n,0,0,n,ans); return ans; }
|