动态规划题,比较典型的“以空间换时间”。先按照递增的顺序把1到N(题目的数据上限)的分解的数目记下,之后直接查询即可。对于i来说,
如果i是奇数,那么因为他只比他前一个偶数多一个1,所以他和前一个偶数的分解数目是一样的。如果i是偶数,我们不妨按照1,2,4,8...的
顺序来分解i。这样,如果第一个分解的元素为1,那么i就和i-1和分解数目相同。如果第一个分解的元素为2或2的m次方,则第二个
(包括2)之后的元素均为偶数,这样各个元素除以2,于是i和i/2的分解数目相同,所以如果i是偶数,那么num[i]=num[i-1]+num[i/2];
程序如下:
#include <cstdio>
#include <cstdlib>
#include <cstring>
const int M = 1000000000;
const int MAXN = 1000010;
int dp[MAXN];
int main()
{
int n;
scanf("%d", &n);
dp[0] = dp[1] = 1;
for (int i = 2; i <= n; ++i)
if (i & 0x01)
dp[i] = dp[i-1];
else
dp[i] = (dp[i-2] + dp[i>>1]) % M;
printf("%d\n", dp[n]);
return 0;
}