• 九度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 }
  • 相关阅读:
    Softmax
    网络流模板大全
    简单数据结构题(from 钟子谦——IOI2018集训队自选题)
    [POJ3177]Redundant Paths
    [BZOJ1051][HAOI2006]受欢迎的牛
    [BZOJ2036]聪明的阿卑多
    [BZOJ1455]罗马游戏
    [POJ2942][LA3523]Knights of the Round Table
    [POJ3352]Road Construction
    练级(train)
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5875092.html
Copyright © 2020-2023  润新知