poj 2229 Sumsets DP

题意:给定一个整数N (1<= N <= 1000000),求出以 N为和 的式子有多少个,式子中的加数只能有2的幂次方组成

    如5 : 1+1+1+1+1、1+1+1+2、1+2+2、1+4,共有5个

思路:当N为奇数时,N的式子中都必有1,故知只需在N-1的式子中都+1就可以,即d[N] = d[N-1]

   当N为偶数时,N的式子可以分为,有1 或者 没1:有1的式子,必有2个1,那么可以由N-2的式子加上两个1;

   没有1的式子,把式子中的加数都除以2,故可以由N/2的式子求得。

AC代码:

#include <cstdio>
using namespace std;
const int N = 1000005;
const int MOD = 1000000000;
int d[N],n;
int main()
{
	d[1] = 1;
	d[2] = 2;
	for(int i = 3; i <= N-5; i++)
	{
		if(i%2) d[i] = d[i-1];
		else d[i] = d[i-2] + d[i/2];
		d[i] %= MOD;
	}
	while(~scanf("%d", &n))
	{
		printf("%d\n", d[n]);
	}
	return 0;
}

  

上一篇:升级到Xcode6.2后 免证书真机调试出错的问题


下一篇:Loadrunner中cookie解释与用法