题目链接:http://poj.org/problem?id=2229
题意:一个数n可以表示成多少种不同的二的幂次的和。
比如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
if (i &1) dp[i] = dp[i-1] eles dp[i] = dp[i-2] + dp[i>>1];
代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <ctype.h>
#include <time.h>
#include <queue>
#include <iterator>
#include <vector>
#include <set>
using namespace std;
int n;
long long dp[1000010];
long long MOD = 1e9;
void init()
{
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= 1000000; i++)
{
if (i & 1) dp[i] = dp[i-1];
else dp[i] = (dp[i - 1] + dp[i >> 1]) % MOD;
}
}
int main()
{
init();
while (scanf("%d", &n) != EOF)
{
printf("%lld\n",dp[n]);
}
return 0;
}