台州 OJ 1632 Sumsets

描述

农夫约翰命令他的母牛搜索不同数量的数字,总和到一个给定的数字。母牛只使用整数幂为2的数字。这是可能的数字组合,总和为7:

1)1 + 1 + 1 + 1 + 1 + 1 + 1 
2)1 + 1 + 1 + 1 + 1 + 2 
3)1 + 1 + 1 + 2 + 2 
4)1 + 1 + 1 + 4 
5)1 + 2 + 2 + 2 
6)1 + 2 + 4 

帮助FJ计算给定整数N的所有可能表示(1 <= N <= 1,000,000)。

 

当 n 是奇数,其方法数与 n-1 一样。 n 是偶数,则 n-1 的方法数加上 n/2 的方法数。(相比于 n-1 多出来的方法,就是把 n 拆成 (n/2)个 2,然后这些 2 合并的方法数。(n/2)个 2 与 (n/2)个 1 的方法数是一样多的)。

代码:

#include <iostream>
#include <cstring>
using namespace std;

const int MAX = 1000001;
const int mod = 1000000000;

long long dp[MAX];

int main(){
    memset(dp, 0, sizeof(dp));
    dp[1] = 1;
    for(int i=2; i<MAX; i++){
        if(i & 1){
            dp[i] = dp[i-1];
        }else{
            dp[i] += (dp[i/2] % mod + dp[i-1] % mod) % mod;
        }
    }
    int n;
    while(cin >> n){
        cout << dp[n] << endl;
    }
}

 

转载于:https://www.cnblogs.com/lighter-blog/p/7226237.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值