您的位置:首页 > 其它

HDU 4671 Partition(定理题)

2013-08-06 19:08 381 查看
题目链接

这题,明显考察搜索能力。。。在中文版的维基百科中找到了公式。

#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
#define MOD 1000000007
#define LL __int64
LL dp[200001];
int que[1001],flag[1001];
int main()
{
int i,n,t,j,num;
LL x;
num = 0;
for(i = 0;;i ++)
{
t = (3*i*i - i)/2;
if(t > 300000) break;
flag[num] = i;
que[num++] = t;
t = (3*i*i + i)/2;
flag[num] = i;
que[num++] = t;
}
dp[1] = 1;dp[2] = 2;
dp[0] = 1;
for(i = 3;i <= 100000;i ++)
{
for(j = 1;j <= 895;j ++)
{
if(que[j] > i)
break;
else
x = dp[i-que[j]];
if(flag[j]%2 == 1)
{
dp[i] = (dp[i] + x)%MOD;
}
else
{
dp[i] = (dp[i] - x)%MOD;
if(dp[i] < 0)
dp[i] += MOD;
}
}
}
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%I64d\n",dp
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: