Sumsets(递推)

Sumsets
Time Limit: 2000MS   Memory Limit: 200000K
Total Submissions: 11899   Accepted: 4787

Description

Farmer John commanded his cows to search for different sets of numbers that sum to a given number. The cows use only numbers that are an integer power of 2. Here are the possible sets of numbers that sum to 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 

Help FJ count all possible representations for a given integer N (1 <= N <= 1,000,000). 

Input

A single line with a single integer, N.

Output

The number of ways to represent N as the indicated sum. Due to the potential huge size of this number, print only last 9 digits (in base 10 representation).

Sample Input

7

Sample Output

6

 

      题意:

      给出数 N (1 ~ 1000000),输出有多少种表示和的方式。每个加数都必须是以2为底的次方数。

 

      思路:

      简单递推。分为偶数和奇数来讨论:

      比如:

      1 可以表示成 1,有 1 种;

      2 可以表示成 1 + 1, 2,有 2 种;

      3 可以表示成 1 + 1, 2 + 1 ,有 2 种;

      4 可以表示成 (1 + 1 + 1, 2 + 1 + 1)( dp [ 3 ] ) ,( 2 + 2 , 4 ) ( dp [ 2 ] ),有 4 种。 如此递推下去,可以发现:

      当 N 为奇数时,dp [ N ] = dp [ N - 1 ];

      当 N 为偶数时,dp [ N ] = dp [ N - 1 ] + dp [ N / 2 ]。结果 % 1000000000 即可。

 

      AC:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long ll;

const ll MOD = 1000000000;
ll dp[1000005];

int main () {
        int n;
        scanf("%d", &n);

        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; ++i) {
                if (i % 2) dp[i] = dp[i - 1];
                else dp[i] = dp[i - 1] + dp[i / 2];
                dp[i] %= MOD;
        }

        printf("%lld\n", dp[n]);

        return 0;
}

 

 

你可能感兴趣的:(set)