logo头像

往者不可谏,来者犹可追。

清华-07-整数拆分

题目描述

一个整数总可以拆分为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;
}
上一篇