九度oj 题目1084:整数拆分 清华大学2010年机试题目

题目描述:

一个整数总可以拆分为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。

样例输入:
7
样例输出:
6

这个题做出来一是找规律,二是推公式
f(n) = f(n-1) + f((n-2)/2) + f((n-4)/4) + ... + f((n-2^t)/t) +...
    //最小为1 最小为2 最小为4
= f(n-1) + f(n/2)

代码如下
 1 #include <cstdio>
 2 #include <cstring>
 3 #define M 1000000000
 4 
 5 int n;
 6 int dp[1000010];
 7 
 8 int main() {
 9 
10     memset(dp, 0, sizeof(dp));
11     dp[1] = 1;
12     dp[2] = 2;
13     for (int i = 3; i <= 1000000; i++) {
14         if (i & 1) {
15             dp[i] = dp[i - 1];
16         }
17         else {
18             dp[i] = (dp[i - 1] + dp[i / 2]) % M;
19         }
20     }
21     while (scanf("%d", &n) != EOF) {
22         printf("%d
", dp[n]);
23     }
24     return 0;
25 }
原文地址:https://www.cnblogs.com/jasonJie/p/5875092.html