dp-poj2229

来源:互联网 发布:在线客服软件有哪些 编辑:程序博客网 时间:2024/06/07 03:25
Language:
Sumsets
Time Limit: 2000MS Memory Limit: 200000KTotal Submissions: 11154 Accepted: 4479

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,所以F(I)=F(I-1)。。当n为偶数时,分两种情况讨论,若第一个数为1,则F[I]=F[I-1],若第一个数不为奇数,则所有数都不为奇数,提取一个2出来,发现是f[n/2],所以,f[n]=f[n-1]+f[n/2]下面是代码:
#include<iostream>#include<set>#include<map>#include<vector>#include<queue>#include<cmath>#include<climits>#include<cstdio>#include<string>#include<cstring>#include<algorithm>typedef long long LL;using namespace std;const int MOD=1000000000;int N;int dp[1000005];int main(){    fill(dp,dp+1000004,0);    dp[0]=1;    for(int i=1; i<=1000000; i++)    {        if(i%2==1)            dp[i]=dp[i-1]%MOD;        else            dp[i]=(dp[i-1]+dp[i/2])%MOD;    }    while(cin>>N)        cout<<dp[N]%MOD<<endl;return 0;}


原创粉丝点击