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

Posted Jason杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了九度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\n", dp[n]);
23     }
24     return 0;
25 }

 

以上是关于九度oj 题目1084:整数拆分 清华大学2010年机试题目的主要内容,如果未能解决你的问题,请参考以下文章

九度[1084]整数拆分

九度oj 题目1083:特殊乘法 清华大学2010年机试题目

九度oj 1063 整数和

九度oj 题目1085:求root(N, k) 清华2010年机试题目

题目1083:特殊乘法-九度oj

九度oj 题目1063:整数和