九度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年机试题目的主要内容,如果未能解决你的问题,请参考以下文章
九度oj 题目1083:特殊乘法 清华大学2010年机试题目