化柿子QWQ,牛顿插值,网上一堆介绍QWQ~
#include <bits/stdc++.h>
using namespace std;
#define mod 1234567891
#define _(d) while(d((ch=getchar()-48)>=0))
int g()
{
char ch;bool f=0;_(!)if(ch==-3)f=1;int v=ch;_()v=v*10+ch;return f?-v:v;
}
typedef long long LL;
const int Maxn=3006;
int fac[Maxn],inv[Maxn],G[Maxn],F[Maxn];
LL Pow(LL x,LL t)
{
LL res=1;
for(;t;t>>=1,x=x*x%mod) if(t&1) res=res*x%mod;
return res;
}
void Pre()
{
fac[0]=1;
for(int i=1;i<=3005;i++) fac[i]=(LL)fac[i-1]*i%mod;
inv[3005]=Pow(fac[3005],mod-2);
inv[0]=1;
for(int i=3004;i;i--) inv[i]=(LL)inv[i+1]*(i+1)%mod;
}
class LIP{
public:
int n,f[Maxn];
void reset(int _n,int *a)
{
n=_n;
for(int i=0;i<=n;i++)
f[i]=a[i];
for(register int j=1;j<=n;++j)
for(register int i=n;i>=j;--i) f[i]=(0ll+mod+f[i]-f[i-1])%mod;
for(int i=0;i<=n;i++)
/*printf("%d\n",f[i]),*/f[i]=1ll*f[i]*inv[i]%mod;
}
int cal(int x)
{
int sum=1,ans=0;
for(int i=0;i<=n;i++)
{
ans=(ans+1ll*f[i]*sum)%mod;
sum=(1ll*mod+x-i)*sum%mod;
}
return ans;
}
}TT;
int T,k,a,n,d;
int main()
{
T=g();
Pre();
while(T--)
{
k=g(); a=g(); n=g(); d=g();
int m=k+3;
for(int i=1;i<=m;i++) G[i]=Pow(i,k);
for(int i=1;i<=m;i++) G[i]=((LL)G[i]+G[i-1])%mod;
for(int i=1;i<=m;i++) G[i]=((LL)G[i]+G[i-1])%mod;
TT.reset(m,G);
for(int i=0;i<=m;i++) F[i]=TT.cal((a+1LL*i*d)%mod);
for(int i=1;i<=m;i++) F[i]=((LL)F[i]+F[i-1])%mod;
TT.reset(m,F);
printf("%d\n",TT.cal(n));
}
// printf("%d\n",n);
return 0;
}