hdu 4658 Integer Partition
阿新 • • 發佈:2018-12-31
設
表示具有限制
的劃分計數的生成函式,
表示沒有限制的劃分計數的生成函式。
由五邊形數定理,有:
設
表示對於
沒有限制的劃分計數,
表示對於
的限制
的劃分計數,有:
預處理出
,就可以
計算
了。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<climits>
#include<cstdio>
#include<random>
using namespace std;
//--Container
//--
#define clr(a) memset(a,0,sizeof(a))
typedef long long ll;
const ll md=1e9+7;
ll qs[100010];
void _init(){
int i,j,k,a,b;for(qs[0]=1,i=1;i<=100000;++i){
for(j=k=1;;++j,k*=-1){
a=(3*(ll)j*j+j)>>1,b=(3*(ll)j*j-j)>>1;
if(i<b)break;qs[i]=(qs[i]+md+qs[i-b]*k)%md;
if(i<a)break;qs[i]=(qs[i]+md+qs[i-a]*k)%md;
}
}
};
ll _cl(int n,int dk){
ll rs=qs[n];int i,j,k;ll a,b;for(j=1,k=-1;;++j,k*=-1){
a=(3*(ll)j*j+j)>>1,b=(3*(ll)j*j-j)>>1;a*=dk,b*=dk;
if(n<b)break;rs=(rs+md+qs[n-b]*k)%md;
if(n<a)break;rs=(rs+md+qs[n-a]*k)%md;
}
return rs;
};
void cl(){
int n,k;scanf("%d %d",&n,&k);printf("%lld\n",_cl(n,k));
};
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // ONLINE_JUDGE
int t;scanf("%d",&t);for(_init();t--;cl());
return 0;
};