求 \(\sum_{i=0}^{k}\binom{m}{i}\binom{n-m}{k-i}i^L\) \((1\leqslant n,m\leqslant 2\times 10^7,1\leqslant L\leqslant 2\times 10^5)\)

这个式子比较简洁,然后也没啥可推的,所以我们将 \(i^L\) 展开.

那么原式为 \(\sum_{i=0}^{k}\binom{m}{i}\binom{n-m}{k-i}\sum_{j=0}^{i}\binom{i}{j}S(L,j)\times (j!)\)

考虑将 \(j\) 前提,得 \(\sum_{j=0}^{k}(j!)S(L,j)\sum_{i=0}^{k}\binom{m}{i}\binom{n-m}{k-i}\binom{i}{j}\)

注意:即使 \(i<j\) 也是无所谓的,因为后面那个组合数可以帮我们抵消掉.

我们发现后面的组合数看起来很眼熟,可以考虑对组合数搞点事情.

\(\sum_{i=0}^{k}\binom{m}{i}\binom{n-m}{k-i}\binom{i}{j}\)

\(\Rightarrow \sum_{i=0}^{k}\binom{m}{j}\binom{m-j}{i-j}\binom{n-m}{k-i}\)

\(\Rightarrow \binom{m}{j}\sum_{i=0}^{k}\binom{m-j}{i-j}\binom{n-m}{k-i}\)

后面那两个组合数有一个性质:上面的 \(n\) 之和和下面的 \(m\) 之和都是定值,所以可以用范德蒙德恒等式

\(\Rightarrow \binom{m}{j}\binom{n-j}{k-j}\)

那么最终答案就是 \(\sum_{j=0}^{k}(j!)S(L,j)\binom{m}{j}\binom{n-j}{k-j}\)

其中斯特林数可以用 \(NTT\) 预处理,然后枚举一下 \(j\) 就好了.

#include <bits/stdc++.h>
#define LL long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
const int M=2000003;
const int N=20000006;
const int mod=998244353,G=3;
inline int qpow(int x,int y)
{
int tmp=1;
for(;y;y>>=1,x=(LL)x*x%mod) if(y&1) tmp=(LL)tmp*x%mod;
return tmp;
}
inline int INV(int x) { return qpow(x,mod-2); }
inline void NTT(int *a,int len,int flag)
{
int i,j,k,mid;
for(i=k=0;i<len;++i)
{
if(i>k) swap(a[i],a[k]);
for(j=len>>1;(k^=j)<j;j>>=1);
}
for(mid=1;mid<len;mid<<=1)
{
int wn=qpow(G,(mod-1)/(mid<<1));
if(flag==-1) wn=INV(wn);
for(i=0;i<len;i+=(mid<<1))
{
int w=1;
for(j=0;j<mid;++j,w=(LL)w*wn%mod)
{
int x=a[i+j], y=(LL)a[i+j+mid]*w%mod;
a[i+j]=(LL)(x+y)%mod, a[i+j+mid]=(LL)(x-y+mod)%mod;
}
}
}
if(flag==-1)
{
int rev=INV(len);
for(i=0;i<len;++i) a[i]=(LL)a[i]*rev%mod;
}
}
int max_n,max_m,L;
int fac[N],inv[N],f[M],A[M],B[M];
inline int C(int x,int y) { return y>x?0:(LL)fac[x]*inv[y]%mod*inv[x-y]%mod; }
inline void Initialize()
{
int i,j,limit;
inv[0]=fac[0]=1;
for(i=1;i<N;++i) fac[i]=(LL)fac[i-1]*i%mod;
inv[N-1]=INV(fac[N-1]);
for(i=N-2;i>=1;--i) inv[i]=1ll*inv[i+1]*(i+1)%mod;
for(i=0;i<=L;++i)
{
A[i]=inv[i],B[i]=(LL)qpow(i,L)*inv[i]%mod;
if(i&1) A[i]=mod-A[i];
}
for(limit=1;limit<=2*(L+1);limit<<=1);
NTT(A,limit,1),NTT(B,limit,1);
for(i=0;i<limit;++i) A[i]=(LL)A[i]*B[i]%mod;
NTT(A,limit,-1);
for(i=0;i<=L;++i) f[i]=A[i];
}
inline void solve()
{
LL ans=0ll;
int i,j,n,m,k,Lim;
scanf("%d%d%d",&n,&m,&k),Lim=min(min(n,m),L);
for(i=0;i<=Lim;++i) (ans+=(LL)f[i]*fac[i]%mod*C(m,i)%mod*C(n-i,k-i))%=mod;
(ans*=(LL)fac[k]*fac[n-k]%mod*inv[n]%mod)%=mod;
printf("%lld\n",ans);
}
int main()
{
// setIO("input");
int i,j,T;
scanf("%d%d%d%d",&max_n,&max_m,&T,&L);
Initialize();
while(T--) solve();
return 0;
}

最新文章

  1. Android编码规范02
  2. 七月十三号CSS3总结《2D的转换》
  3. CSS图片裁剪Clip
  4. foreach遍历遇到的一个细节问题
  5. 在 Visual C# 项目中调用 VBA 中的代码
  6. Android:Xml(读取与存储)
  7. 部分网站允许空白referer的防盗链图片的js破解代码
  8. php变量双击选择无法选择$符号
  9. Centos7 update dotnet 无法识别
  10. 026_nginx引用lua遇到的坑
  11. [hadoop] hadoop native libraries 编译
  12. Light Explorer
  13. WorldWind源码剖析系列:外包围盒类BoundingBox和外包围球类BoundingSphere
  14. python modules and packages
  15. 【转载】MSXML应用总结 开发篇(上)
  16. GNU诞生三十周年
  17. db_recovery_file_dest_size 修改大一点及删除归档日志 |转|
  18. 基于STL优先队列和邻接表的dijkstra算法
  19. 通过创建脚本代替&quot;scrapy crawl Test&quot;命令
  20. jqueryDom操作

热门文章

  1. gorm 批量插入数据
  2. JavaScript Web API 全选反选案例
  3. 流程审批时执行BE插件
  4. 如何在 WPF 中获取所有已经显式赋过值的依赖项属性
  5. 上传自己的 NuGet 包
  6. 【洛谷 P3674】 小清新人渣的本愿(bitset,莫队)
  7. React Native 开发豆瓣评分(三)集成 Redux
  8. android 给ImageView设置路径
  9. [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  10. 【scala】scala安装测试