正题
题目链接:https://www.luogu.com.cn/problem/P6620
题目大意
给出n,x,p,mn,x,p,mn,x,p,m和一个mmm次多项式fff求
∑k=0nf(k)×xk×(nk)\sum_{k=0}^nf(k)\times x^k\times \binom{n}{k}k=0∑nf(k)×xk×(kn)
答案对ppp取模。
1≤n≤109,1≤m≤10001\leq n\leq 10^9,1\leq m\leq 10001≤n≤109,1≤m≤1000
解题思路
什么混凝土数学题
首先我们发现这个组合数(nk)\binom{n}{k}(kn)处理的十分难受,有一个下降幂的结论正好可以把这个难受的kkk变掉。
(nk)×km‾=(n−mk−m)×nm‾\binom{n}{k}\times k^{\underline{m}}=\binom{n-m}{k-m}\times n^{\underline m}(kn)×km=(k−mn−m)×nm
我们需要找到一个东西来提供km‾k^{\underline m}km,此时给我们的多项式fff就是一个不错的选择。
我们考虑把多项式转换为下降幂的形式
f(x)=∑i=0maixi=∑i=0mbixi‾f(x)=\sum_{i=0}^ma_ix^i=\sum_{i=0}^mb_ix^{\underline i}f(x)=i=0∑maixi=i=0∑mbixi
考虑一下怎么找到序列bib_ibi,也就是我们需要把xix^ixi转换为下降幂的形式,有一个第二类斯特林数的性质就是
xn=∑i=0n{ni}xi‾x^n=\sum_{i=0}^{n}{\begin{Bmatrix}n\\i\end{Bmatrix}}x^{\underline i}xn=i=0∑n{ni}xi
∑i=0maixi=∑i=0mai∑j=0i{ij}xj‾⇒bi=∑i=jn{ji}xi‾\sum_{i=0}^ma_ix^i=\sum_{i=0}^ma_i\sum_{j=0}^i{\begin{Bmatrix}i\\j\end{Bmatrix}}x^{\underline j}\Rightarrow b_i=\sum_{i=j}^n{\begin{Bmatrix}j\\i\end{Bmatrix}}x^{\underline{i}}i=0∑maixi=i=0∑maij=0∑i{ij}xj⇒bi=i=j∑n{ji}xi
然后就可以继续推我们的式子了
∑k=0n∑i=0mbiki‾×xk×(nk)\sum_{k=0}^n\sum_{i=0}^mb_ik^{\underline i}\times x^k\times \binom{n}{k}k=0∑ni=0∑mbiki×xk×(kn)
∑k=0n∑i=0mbixk(n−ik−i)ni‾\sum_{k=0}^n\sum_{i=0}^mb_ix^k\binom{n-i}{k-i}n^{\underline i}k=0∑ni=0∑mbixk(k−in−i)ni
把iii提出去枚举
∑i=0mbini‾∑k=0nxk(n−ik−i)\sum_{i=0}^mb_in^{\underline i}\sum_{k=0}^nx^k\binom{n-i}{k-i}i=0∑mbinik=0∑nxk(k−in−i)
⇒∑i=0mbini‾xi∑k=0n−i(n−ik)xk\Rightarrow \sum_{i=0}^mb_in^{\underline i}x^i\sum_{k=0}^{n-i}\binom{n-i}{k}x^k⇒i=0∑mbinixik=0∑n−i(kn−i)xk
然后后面那个式子就可以二项式定理了
⇒∑i=0mbini‾xi(x+1)n−i\Rightarrow \sum_{i=0}^mb_in^{\underline i}x^i(x+1)^{n-i}⇒i=0∑mbinixi(x+1)n−i
然后就搞定了
时间复杂度O(m2+mlogn)O(m^2+m\log n)O(m2+mlogn)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1100;
ll n,x,m,P,a[N],b[N],s[N][N],ans;
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
signed main()
{scanf("%lld%lld%lld%lld",&n,&x,&P,&m);for(ll i=0;i<=m;i++)scanf("%lld",&a[i]);s[0][0]=1; for(ll i=1;i<=m;i++)for(ll j=1;j<=i;j++)s[i][j]=(s[i-1][j]*j%P+s[i-1][j-1])%P;for(ll i=0;i<=m;i++)for(ll j=i;j<=m;j++)(b[i]+=a[j]*s[j][i]%P)%=P;for(ll i=0,tmp=1;i<=m;i++){(ans+=b[i]*tmp%P*power(x,i)%P*power(x+1,n-i)%P)%=P;tmp=tmp*(n-i)%P;}printf("%lld\n",ans);return 0;
}