• 整数拆分


    Jack Cheng学完了计算机基础导论,了解到任何一个数都可以用二进制数来表示,爱玩游戏的他忍不住想要玩一个游戏,既然可以用二进制数表示,那么就可以写成若干个二进制数相加,例如: 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。现在他希望你和他一起来玩这个游戏。

    输入格式:

    请在这里写输入格式。例如:输入在一行中给出2个绝对值不超过1000的整数A和B。

    输出格式:

    第一行输入n表示有那个输入,后面每一行输入一个N(1<=N<=1000000)。所有输出只占一行(行末无多余空格)。

    输入样例:

    1
    7
    

    输出样例:

    6

    题目分析 : 一道pta 上面的题,将一个 n 分成全部是 2 进制的数,问共有多少种分法,对于一个奇数来说,其拆分的情况是等同于比它小1的偶数的,我们在来看偶数的情况,其拆分情况是 f[i] = f[i-1]+f[i/2];
    代码示例 :
    /*
     * Author:  parasol 
     * Created Time:  2018/3/21 11:31:05
     * File Name: 1.cpp
     */
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <set>
    #include <map>
    #include <time.h>
    using namespace std;
    #define ll long long
    const ll maxn = 1e6+5;
    const double pi = acos(-1.0);
    const ll inf = 0x3f3f3f3f;
    const ll mod = 1000000000;
    
    ll pre[maxn];
    void init() {
        pre[1] = 1; 
        
        for(ll i = 2; i <= 1000000; i++){
            if (i % 2) pre[i] = pre[i-1];
            else pre[i] = pre[i-1] + pre[i/2];
            pre[i] %= mod;
        }
    }
    
    int main() {
        //freopen("in.txt", "r", stdin);
        //freopen("out.txt", "w", stdout);
        ll t, n;
        
        cin >> t;
        init();
        while(t--){
            cin >> n;
            printf("%lld%c", pre[n], t==0?'
    ':' ');
        }
        return 0;
    }
    
    东北日出西边雨 道是无情却有情
  • 相关阅读:
    在Visual Studio中使用NUnit
    C#调用Exe
    网页用chrome打开为乱码
    ctags最基本用法
    Facebook Connect
    SVM初体验
    python中可恶的回车符
    初识PowerDesigner
    Mysql中文乱码问题解决
    stat函数
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/8616176.html
Copyright © 2020-2023  润新知