题目链接:http://poj.org/problem?id=2229
题意:给出一个数,求出它由2的幂的组成的划分总数。
之前在 Debugcool http://blog.csdn.net/Debugcool/article/details/4855291 这位仁兄的博客上看过他整理的dp整数划分,这题的划分和这位仁兄说的第三种很像,稍微改改就行了。
一开始把mod定义成10000000000(多了个0),没发现,于是把数据改成64位的整形,后来才发现,改了过来,由此发现了点问题
把数据类型定义成64位整形时,dp[v]%=mod会超时
要写成if(dp[v]>=mod) dp[v]=dp[v]-mod;才行。如果是32位用模运算也能过但是用减的话快差不多2倍。原来模运算也是比较慢的。
#include<iostream>
using namespace std;
#define maxn 1000000+5
#define mod 1000000000//粗心,一开始多了个0
int dp[maxn];
int main()
{
int n,u,v;
while(scanf("%d",&n)!=EOF)
{
dp[0]=1;
for(u=1;u<=n;u=u*2)
for(v=u;v<=n;v++)
{
dp[v]=dp[v-u]+dp[v];
dp[v]=dp[v]%mod;
}
printf("%d\n",dp[n]);
memset(dp,0,sizeof(dp));
}
return 0;
}