ACM----C - Sumsets

黑色的飞鸟掠过天空,我站在城中,看时间燃成灰烬,哗哗作响......

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

这个题算是一个找规律的题,或者根据是2的倍数也大致可以得到一些规律。

当N为奇数时,毫无疑问,它肯定和它前面的偶数组成的个数相同,因为只比前面的偶数大一,组成的个数不能再多了,就是在偶数的所有组合中加一,就可以得到这个奇数。

当N为偶数时,可以多写几个数找找规律,你会发现偶数组成的个数与N/2和N -2组成的个数有关,即是它们的个数和。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define inf 1000000000
typedef long long ll;
using namespace std;
int s[1000010];
int main()
{
    int N,i;
    scanf("%d",&N);
    s[1]=1;
    s[2]=2;
    for(i=3;i<=1000010;i++)
    {
        if(i%2==1)
            s[i]=s[i-1]%inf;
        else
            s[i]=(s[i/2]+s[i-2])%inf;

    }
    printf("%d",s[N]);
    return 0;
}

 

你可能感兴趣的:(ACM)