题目
求:
[left(sumlimits_{k=0}^nf(k) imes x^k imes dbinom{n}{k}
ight)mod p
]
其中:
[f(k)=a_0+a_1k+a_2k^2+cdotcdotcdot +a_mk^m
]
[inom{n}{k}=frac{n!}{k!(n-k)!}
]
题解
吸收恒等式:
[k imesinom{n}{k}=n imesinom{n-1}{k-1}
]
二项式定理:
[(x+1)^n=sumlimits_{i=0}^ninom{n}{i}x^i
]
[egin{aligned}
原式&=sumlimits_{k=0}^nf(k) imes x^k imes dbinom{n}{k}\
&=sumlimits_{k=0}^n(a_0+a_1k+a_2k^2+cdotcdotcdot +a_mk^m) imes x^k imesinom{n}{k}\
&=sumlimits_{k=0}^n(sumlimits_{i=0}^ma_ik^i) imes x^k imesinom{n}{k}\
&=sumlimits_{i=0}^ma_i left( sumlimits_{k=0}^nk^i imes x^k imesinom{n}{k}
ight) \
end{aligned}
]
对于每一个 (a_i) 只考虑第二个和式:
[sumlimits_{k=0}^nk^i imes x^k imesinom{n}{k}=sumlimits_{k=0}^nk^i imesinom{n}{k} imes x^k
]
单考虑前面两项 (k^i imesinom{n}{k}) ,尝试对它使用吸收恒等式。
[k imesinom{n}{k}=n imesinom{n-1}{k-1}\
]
[egin{aligned}
k^2 imesinom{n}{k}&=k imes n imesinom{n-1}{k-1}\
&=(k-1+1) imes n imesinom{n-1}{k-1}\
&=(k-1) imes n imesinom{n-1}{k-1}+n imesinom{n-1}{k-1}\
&=n imes(n-1) imesinom{n-2}{k-2}+n imesinom{n-1}{k-1}
end{aligned}
]
[egin{aligned}
k^3 imesinom{n}{k}&=k imesleft(k^2 imesinom{n}{k}
ight)\
&=k imesleft(n imes(n-1) imesinom{n-2}{k-2}+n imesinom{n-1}{k-1}
ight)\
&=k imes n imes(n-1) imesinom{n-2}{k-2}+k imes n imesinom{n-1}{k-1}\
&=(k-2+2) imes n imes(n-1) imesinom{n-2}{k-2}+(k-1+1) imes n imesinom{n-1}{k-1}\
&=(k-2) n(n-1)inom{n-2}{k-2}+2 n(n-1)inom{n-2}{k-2}+(k-1) ninom{n-1}{k-1}+ninom{n-1}{k-1}\
&=n(n-1)(n-2)inom{n-3}{k-3}+2 n(n-1)inom{n-2}{k-2}+n(n-1)inom{n-2}{k-2}+ninom{n-1}{k-1}\
&=n imes(n-1) imes(n-2) imesinom{n-3}{k-3}+3 imes n imes(n-1) imesinom{n-2}{k-2}+n imesinom{n-1}{k-1}\
&=n^{underline{2}} imesinom{n-3}{k-3}+3 imes n^{underline{1}} imesinom{n-2}{k-2}+n^{underline{0}} imesinom{n-1}{k-1}
end{aligned}
]
其中 (n^{underline{k}}) 表示 (n) 的 (k) 阶下降幂,等于 (prodlimits_{i=0}^k(n-k))。
会发现:
[egin{aligned}
k^i imesinom{n}{k}&=sumlimits_{j=1}^{k}S(i,j) imes n^{underline{j-1}} imesinom{n-j}{k-j} \
end{aligned}
]
其中 (S(k,j)) 表示一个系数,即 (3 imes n^{underline{1}} imesinom{n-2}{k-2}) 中的 3。
考虑这个 (S(k,j)) 是怎么来的:
- (k imes n imes(n-1) imesinom{n-2}{k-2}) 为了变成 (n imes(n-1) imes(n-2) imesinom{n-3}{k-3}) 将 (k) 减去了 2,这个 2 给了 (S(k,j)),得到了 (S(k-1,j)) 倍个 2。
- (k imes n imesinom{n-1}{k-1}) 为了变成 (n^{underline{1}} imesinom{n-2}{k-2}) 使用了吸收恒等式,(S(k,j)) 得到了 (S(k-1,j-1)) 倍的 1。
可以得出:
[S(i,j)=i imes S(i-1,j)+S(i-1,j-1)
]
这其实就是一个斯特林数,不过本题用不上太深奥的斯特林数知识,得出这个递推式就可以了。
所以:
[egin{aligned}
sumlimits_{k=0}^nk^i imes x^k imesinom{n}{k}&=sumlimits_{k=0}^nk^i imesinom{n}{k} imes x^k\
&=sumlimits_{k=0}^nleft(sumlimits_{j=1}^{k}S(i,j) imes n^{underline{j-1}} imesinom{n-j}{k-j}
ight) imes x^k\
&=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes sumlimits_{k=1}^nleft(inom{n-j}{k-j} imes x^k
ight)\
&=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes sumlimits_{k=j}^nleft(inom{n-j}{k-j} imes x^k
ight)\
&=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes sumlimits_{k=j}^nleft(inom{n-j}{k-j} imes x^{k-j} imes x^j
ight)\
&=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes x^j imes sumlimits_{k=j}^nleft(inom{n-j}{k-j} imes x^{k-j}
ight)\
&=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes x^j imes sumlimits_{k'=0}^{n-j}left(inom{n-j}{k'} imes x^{k'}
ight)\
&=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes x^j imes (x+1)^{n-j}\
end{aligned}
]
第三个等式到第四个等式的变换中将 (k=1) 变为了 (k=j),因为 (k<j) 时 (inom{n-j}{k-j}) 无意义,值为 0。
第六个等式到第七个等式的变换中令 (k'=k-j),然后发现第二个和式是二项式定理,因此变换到了第八个等式。
[egin{aligned}
原式&=sumlimits_{i=0}^m a_i left( sumlimits_{k=0}^nk^i imes x^k imesinom{n}{k}
ight) \
&=a_0 imes(x+1)^n+sumlimits_{i=1}^m a_i left(sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes x^j imes (x+1)^{n-j}
ight)
end{aligned}
]
这是一个 (O(m^2)) 的运算。
当 (i=0) 时要特殊处理一下。
[egin{aligned}
&a_0 imesleft( sumlimits_{k=0}^nk^0 imes x^k imesinom{n}{k}
ight)\
&=a_0 imesleft( sumlimits_{k=0}^nx^k imesinom{n}{k}
ight)\
&=a_0 imes(x+1)^n
end{aligned}
]
然后就可以愉快地切省选题了。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL N,X,P,M,a[1010],ans=0;
LL S[1010][1010],N_[1010],X_1[1010],Xmi[1010];
//N_[4] = N 的四阶下降幂
//X_1[5] = (X+1)^(N-5)
//Xmi[7] = X^7
inline LL read()
{
LL x=0,w=0;char ch=0;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return w?-x:x;
}
LL ksm(LL B,LL K,LL A=1)
{
for(;K;K>>=1,B=B*B%P)
if(K&1)A=A*B%P;
return A%P;
}
void prepare()
{
N_[0]=N;Xmi[0]=1;S[1][1]=1;
for(int i=1;i<=M;i++)N_[i]=N_[i-1]*(N-i)%P;
for(int i=0;i<=M;i++)X_1[i]=ksm(X+1,N-i);
for(int i=1;i<=M;i++)Xmi[i]=Xmi[i-1]*X%P;
for(int i=2;i<=M;i++)
for(int j=1;j<=i;j++)
S[i][j]=(S[i-1][j]*j+S[i-1][j-1])%P;
}
int main()
{
N=read();X=read();P=read();M=read();X%=P;
for(int i=0;i<=M;i++)a[i]=read();
prepare();
ans=a[0]*X_1[0]%P;
for(int i=1;i<=M;i++){
for(int j=1;j<=i;j++)
ans=(ans+a[i]*S[i][j]%P*N_[j-1]%P*Xmi[j]%P*X_1[j]%P)%P;
}
cout<<ans<<'
';
return 0;
}