整数拆分

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?'\n':' ');
    }
    return 0;
}

 

posted @ 2018-03-21 11:54  楼主好菜啊  阅读(784)  评论(0编辑  收藏  举报