题目:点击打开链接
这个题目来自多校练习5,求整数划分的种类数,二维DP一定超时,一维打表试了试(参考poj上吃蛋糕的题,范围是5000/5S),大于120KB,没法提交。
找了半天,当时明明在wiki找到公式了(传说中的五边形数),但是却没有转化好,惨遭wa。
链接:点击打开链接
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
long long tar[100002];
const int MOD=1000000007;
void init()
{
memset(tar,0,sizeof(tar));
tar[0]=1;
for(int i=1;i<=100000;i++)
{
int nbit;
for(int j=1;;j++)
{
int element1,element2;
element1=i-j*(3*j-1)/2;
element2=i-j*(3*j+1)/2;
if(j&1)
nbit=1;
else if(j%2==0)
nbit=-1;
if(element2<0 && element1<0)
break;
if(element1>=0)
{
tar[i]=(tar[i]+nbit*tar[element1])%MOD;
}
if(element2>=0)
{
tar[i]=(tar[i]+nbit*tar[element2])%MOD;
}
}
tar[i]=(tar[i]+MOD)%MOD;
}
}
int main()
{
int testcase;
init();
cin>>testcase;
while(testcase--)
{
int rat;
cin>>rat;
cout<<tar[rat]<<endl;
}
return 0;
}