第一类斯特林数·行的一个部分是求 (n+c)n,也就是: ∑i=0nxii!1∑i=0ji!fi(j−i)!cj−i 可以直接把后面两个卷起来,但是第一篇题解的做法是把 F 反过来卷积,再返回去,答案应该是一样的啊/yiw
code1(直接卷)
void offset(const int*f,int*g,int c,int n){
static int b1[M],b2[M];
int i,p=1,len=1;
while(len<=(n<<1))len<<=1;
for(i=0;i<n;++i,p=1ll*p*c%mod){
b1[i]=1ll*f[i]*fac[i]%mod;
b2[n-i-1]=1ll*p*ifac[i]%mod;
}
for(i=n;i<len;++i)b1[i]=b2[i]=0;
NTT(b1,1,len);NTT(b2,1,len);
px(b1,b2,len);NTT(b1,0,len);
for(i=0;i<n;++i)g[i]=1ll*b1[i]*ifac[i]%mod;
}
code2:(翻转后卷)
void offset(const int*f,int*g,int c,int n){
static int b1[M],b2[M];
int i,p=1,len=1;
while(len<=(n<<1))len<<=1;
for(i=0;i<n;++i,p=1ll*p*c%mod){
b1[n-i-1]=1ll*f[i]*fac[i]%mod;
b2[i]=1ll*p*ifac[i]%mod;
}
for(i=n;i<len;++i)b1[i]=b2[i]=0;
NTT(b1,1,len);NTT(b2,1,len);
px(b1,b2,len);NTT(b1,0,len);
for(i=0;i<n;++i)g[i]=1ll*b1[n-i-1]*ifac[i]%mod;
}
然而两份代码输出却不一样。。。
为什么啊/yiw