解析
给出 n,x,pn,x,pn,x,p 和一个 mmm 次的多项式 f(k)f(k)f(k),求解:
∑k=0nf(k)xk(nk)modp\sum_{k=0}^nf(k)x^k\binom n k\mod pk=0∑nf(k)xk(kn)modp
把多项式拆成若干个单项式,现在就是要求:
∑k=0nkpxk(nk)\sum_{k=0}^nk^px^k\binom n kk=0∑nkpxk(kn)
直接拆阶乘,可以得到:
(nk)k=n(n−1k−1)\binom n kk=n\binom {n-1}{k-1}(kn)k=n(k−1n−1)
尝试把 kpk^pkp 揉进组合数:
(nk)k=n(n−1k−1)\binom n k k=n\binom {n-1}{k-1}(kn)k=n(k−1n−1)
(nk)k2=kn(n−1k−1)=n(n−1)(n−2k−2)+n(n−1k−1)\binom n k k^2=kn\binom {n-1}{k-1}=n(n-1)\binom{n-2}{k-2}+n\binom{n-1}{k-1}(kn)k2=kn(k−1n−1)=n(n−1)(k−2n−2)+n(k−1n−1)
(nk)k3=k(n(n−1)(n−2k−2)+n(n−1k−1))\binom n k k^3=k(n(n-1)\binom{n-2}{k-2}+n\binom{n-1}{k-1})(kn)k3=k(n(n−1)(k−2n−2)+n(k−1n−1))
=n(n−1)(n−2)(n−3k−3)+2n(n−1)(n−2k−2)+n(n−1)(n−2k−2)+n(n−1k−1)=n(n-1)(n-2)\binom{n-3}{k-3}+2n(n-1)\binom{n-2}{k-2}+n(n-1)\binom{n-2}{k-2}+n\binom{n-1}{k-1}=n(n−1)(n−2)(k−3n−3)+2n(n−1)(k−2n−2)+n(n−1)(k−2n−2)+n(k−1n−1)
=n(n−1)(n−2)(n−3k−3)+3n(n−1)(n−2k−2)+n(n−1k−1)=n(n-1)(n-2)\binom{n-3}{k-3}+3n(n-1)\binom{n-2}{k-2}+n\binom{n-1}{k-1}=n(n−1)(n−2)(k−3n−3)+3n(n−1)(k−2n−2)+n(k−1n−1)
归纳以下,可以有:
(nk)kp=∑i=1pni‾(n−ik−i)s(p,i)\binom n k k^p=\sum_{i=1}^pn^{\underline i}\binom {n-i}{k-i}s(p,i)(kn)kp=i=1∑pni(k−in−i)s(p,i)
其中 s(p,i)s(p,i)s(p,i) 为转移系数。
考虑这个转移系数怎么来的,它可以从 p−1p-1p−1 行的 s(p−1,i)s(p-1,i)s(p−1,i) 的 kkk 拆出一个 (k−i),i(k-i),i(k−i),i 时得到 i∗s(p−1,i)i*s(p-1,i)i∗s(p−1,i),也可以从 s(p−1,i−1)s(p-1,i-1)s(p−1,i−1) 升一个上来,所以有:
s(p,i)=i∗s(p−1,i)+s(p−1,i−1)s(p,i)=i*s(p-1,i)+s(p-1,i-1)s(p,i)=i∗s(p−1,i)+s(p−1,i−1)
边界为:s(1,1)=1s(1,1)=1s(1,1)=1。
注意到,这个东西其实就是第二类斯特林数。
那么我们接着推:
∑k=0nkpxk(nk)=∑k=0nxk∑i=1pni‾(n−ik−i)s(p,i)=∑i=1pni‾s(p,i)∑k=inxk(n−ik−i)\sum_{k=0}^nk^px^k\binom n k=\sum_{k=0}^nx^k\sum_{i=1}^pn^{\underline i}\binom {n-i}{k-i}s(p,i)=\sum_{i=1}^pn^{\underline i}s(p,i)\sum_{k=i}^nx^k\binom {n-i}{k-i}k=0∑nkpxk(kn)=k=0∑nxki=1∑pni(k−in−i)s(p,i)=i=1∑pnis(p,i)k=i∑nxk(k−in−i)
=∑i=1pni‾s(p,i)xi∑k=0n−ixk(n−ik)=∑i=1pni‾s(p,i)xi(1+x)n−i=\sum_{i=1}^pn^{\underline i}s(p,i)x^i\sum_{k=0}^{n-i}x^k\binom {n-i}{k}=\sum_{i=1}^pn^{\underline i}s(p,i)x^i(1+x)^{n-i}=i=1∑pnis(p,i)xik=0∑n−ixk(kn−i)=i=1∑pnis(p,i)xi(1+x)n−i
带回到最初的式子:(注意前面的式子需要 p≥1p\ge 1p≥1,所以常数项单独算)
ans=∑p=1map∑i=1pni‾s(p,i)xi(1+x)n−i+a0(1+x)nans=\sum_{p=1}^ma_p\sum_{i=1}^pn^{\underline i}s(p,i)x^i(1+x)^{n-i}+a_0(1+x)^nans=p=1∑mapi=1∑pnis(p,i)xi(1+x)n−i+a0(1+x)n
=∑i=1mxi(1+x)n−ini‾∑p=imaps(p,i)=\sum_{i=1}^mx^i(1+x)^{n-i}n^{\underline i}\sum_{p=i}^ma_ps(p,i)=i=1∑mxi(1+x)n−inip=i∑maps(p,i)
总复杂度 O(m(m+logn))O(m(m+\log n))O(m(m+logn))
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
using namespace std;const int N=1050;
const int inf=1e9;
int mod;inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}inline ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res;
}int n,m,x;
ll s[N][N],a[N];signed main() {
#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);
#endifn=read();x=read();mod=read();m=read();for(int i=0;i<=m;i++) a[i]=read();ll ans=a[0]*ksm(x+1,n)%mod;s[0][0]=1;for(int i=1;i<=m;i++){for(int j=1;j<=i;j++) s[i][j]=(j*s[i-1][j]+s[i-1][j-1])%mod;}for(int j=1;j<=m;j++){ll bas=ksm(x,j)*ksm(x+1,n-j)%mod;for(int i=1;i<=j;i++) bas=bas*(n-i+1)%mod;//ll res(0);for(int i=j;i<=m;i++) (ans+=bas*s[i][j]%mod*a[i])%=mod;}printf("%lld\n",ans);return 0;
}
/*
*/