题目描述
给定一个数N (1 <= N <= 1,000,000),将其分解为若干个2的幂次方数。问其有几种分解方式。
样例
输入
7
输出
6
样例解释
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+2+2
7=1+1+1+4
7=1+2+2+2
7=1+2+4
解题思路
仔细分析以后不难发现,如果n是奇数(不是1),那么它其实和n-1的情况个数是一样的(无非是在每种情况最后加了一个1)。所以我们只需要分析所有偶数个的情况就可以了。我们可以把某个偶数 分成两种情况讨论:
A.分解式中有1出现。不难看出,这时必须有2个1一直放在那里不动。那么这种情况的数量不就和n-2的情况的数量相等吗?(仔细想)
B.分解式中没有1出现。这时所有分解数都是偶数。那么把他们都除以2好了!你会发现…………居然就成了n/2的情况!!
到这里就显然了……递推。 详见代码。
#include <cstdio>
const int maxn = 1000010;
int ans[maxn];
int main()
{
ans[1] = 1;
ans[2] = 2;
for(int i = 3 ; i < maxn ; i ++){
if(i%2){//奇数
ans[i] = ans[i-1];
}else{//偶数
ans[i] = ans[i-2] + ans[i/2];
}
}
int n;
scanf("%d",&n);
printf("%d\n",ans[n]);
return 0;
}