单点时限: 2.0 sec
内存限制: 256 MB
将一个正整数拆分为成 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 (1≤n≤1000000),输出 f(n)。
输入格式
第 1 行:一个整数 T (1≤T≤10) 为问题数。
接下来 T 行,每行输入一个正整数 n(1≤n≤1000000)。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。
然后对应每个问题在一行中输出 f(n)。
样例
input
3
7
9
46
output
case #0:
6
case #1:
10
case #2:
598
/*
思路:dp
i为奇数是只能是前一个数加一得到,个数为dp[i-1]。
i为偶数是可以是前一个数加1,也可以是前i/2个数乘以2,总个数为dp[i-1]+dp[i/2]
*/
#include<stdio.h>
int MAX=1000001;
int main()
{
long long ans[MAX]={0};
int i, j, n;
ans[0]=1;
ans[1]=1;
for(i=2; i<1000001; i++)
{
if(i%2) ans[i]=ans[i-1];
else ans[i]=(ans[i-1]+ans[i/2]);
}
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&j);
printf("case #%d:\n%lld\n",i,ans[j]);
}
return 0;
}