求 \(\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;
}

【洛谷2791】 幼儿园篮球题 第二类斯特林数+NTT相关推荐

  1. luogu2791 幼儿园篮球题 第二类斯大林数(特)卡常NTT

    我真的是***的 原本应该是乘以iLi^LiL 但是因为 iL=∑j=0L\{Lj\}(ij)j!i^L=\sum_{j = 0}^L {L \brace j} \binom{i}{j} j! iL= ...

  2. 洛谷 P2791 幼儿园篮球题

    洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...

  3. bzoj5093 图的价值【第二类斯特林数+NTT】

    解题思路: 考虑直接枚举每个点连的边,图中其余点之间随便连,那么直接推式子: ans=n∗2C2n−1∑i=0n−1Cin−1ikans=n*2^{C_{n-1}^2}\sum\limits_{i=0 ...

  4. 洛谷P2791 幼儿园篮球题

    题目描述 题解 可以列出式子∑i=0k(im)(k−in−m)iL(kn)\frac{\sum_{i=0}^k(_i^m)(_{k-i}^{n-m})i^L}{(_k^n)}(kn​)∑i=0k​(i ...

  5. 【CF961G】Partitions(第二类斯特林数)

    [CF961G]Partitions(第二类斯特林数) 题面 CodeForces 洛谷 题解 考虑每个数的贡献,显然每个数前面贡献的系数都是一样的. 枚举当前数所在的集合大小,所以前面的系数\(p\ ...

  6. 第一类和第二类斯特林数

    第一类斯特林数 第一类斯特林数定义如下: \(s_1(n,k)\)表示\(n\)个元素组成\(k\)个圆排列的方案数. 其中\(n\)个元素的圆排列定义为\(n\)个元素围成一圈的排列,两个圆排列本质 ...

  7. BZOJ 2159 「国家集训队」Crash 的文明世界(第二类斯特林数,换根DP)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2159 是 hydro 的 BZOJ ...

  8. 新疆大学(新大)OJ xju 1006: 比赛排名 第二类斯特林数+阶乘

    题目链接:http://acm.xju.edu.cn/JudgeOnline/problem.php?id=1006 第二类斯特林数: 第二类Stirling数实际上是集合的一个拆分,表示将n个不同的 ...

  9. 1847 奇怪的数学题(杜教筛 + Min_25 + 第二类斯特林数)

    1847 奇怪的数学题 推式子 ∑i=1n∑j=1nsgcd(i,j)k∑d=1nsgcd(d)k∑i=1nd∑j=1nd[gcd(i,j)=1]∑d=1nsgcd(d)k(2∑i=1ndϕ(i)−1 ...

最新文章

  1. 直接拿来用!最火的Android开源项目(一)
  2. Android开发者指南(12) —— Android Supported Media Formats
  3. 【8】万魂杀服务器开发方面之新版GM工具
  4. 你需求什么样的图片素材资源,各种口味随你挑选!
  5. mysql获取当前时间,前一天,后一天
  6. mysql之旅【第一篇】
  7. Protobuf实现Android Socket通讯开发教程
  8. Android学习开发之路~~系列教程
  9. 数据情报分析EXCEL篇
  10. 嵌入式和单片机的区别到底在哪?
  11. java js 二级联动下拉列表_最简单js代码实现select二级联动下拉菜单
  12. linux tmp文件夹满了,linux出现tmp空间满的情况解决
  13. 基于近半年Twitter与Github趋势分析_12大分类500+ChatGPT最新开源GitHub存储库(涵盖ChatGPT开发全框架、全编程语言及教程)——每周更新
  14. 多家机构宣布接入文心一言能力
  15. PICASSO,一个高效的搜推广稀疏训练解决方案
  16. 【行业基础】UV打印机喷头波形和墨水关系
  17. 从傅里叶变换到Laplace变换
  18. mysql unique 重复_Mysql中 unique列插入重复值该怎么解决呢
  19. [项目管理]项目计划如何做
  20. 计算机系统使用显示器需配有,在计算机系统中,使用显示器一般需配有( )。...

热门文章

  1. word中常用快捷键
  2. [PTA]实验5-3 使用函数求奇数和
  3. Android 仿今日头条视频播放器实现(不使用节操哟)
  4. 使用阿里云提供的短信服务发送短信(个人版)
  5. SeedLab10: Linux Firewall Exploration Lab
  6. 去掉最高分最低分求平均分
  7. 神经网络与深度学习---train_loss和val_loss(test_lost)分析
  8. 《论文写作》课堂收获
  9. linux查看电源状态命令,Linux下查看电池损耗等信息
  10. AdGuard免费的电脑手机广告拦截程序