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
一个数,只用2的幂次表示,共有多少种表示方法。
这题我一开始不会,恩,去年还上去就秒的- -,实际就是一个递推。偶数的时候,一定是有偶数个1参与表示的(除了1其他都是偶数),即可以从dp[i - 2]转移过来,如果表示中没有1,那么都是偶数,全部除以2,表示的个数和dp[i/2]是一样的,即dp[i] = dp[i - 2] + dp[i/2];
若是奇数,在dp[i - 1]的方案中全部加1即可。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<utility>
#include<sstream>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1005;
int dp[1000005];
int main()
{
#ifdef LOCAL
freopen("C:\\Users\\ΡΡ\\Desktop\\in.txt","r",stdin);
//freopen("C:\\Users\\ΡΡ\\Desktop\\out.txt","w",stdout);
#endif // LOCAL
memset(dp,0,sizeof(dp));
int n = 1000000;
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 - 2] + dp[i/2])%1000000000;
}
while(scanf("%d",&n) != EOF)
{
printf("%d\n",dp[n]);
}
return 0;
}