【洛谷2791】 幼儿园篮球题 第二类斯特林数+NTT
求 \(\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的更多相关文章
- 洛谷 P2791 幼儿园篮球题
洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...
- BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT
定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...
- BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】
题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...
- BZOJ4555 [Tjoi2016&Heoi2016]求和 【第二类斯特林数 + NTT】
题目 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + ...
- bzoj 5093 图的价值 —— 第二类斯特林数+NTT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 每个点都是等价的,从点的贡献来看,得到式子: \( ans = n * \sum\li ...
- bzoj 4555 [Tjoi2016&Heoi2016] 求和 —— 第二类斯特林数+NTT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 关于第二类斯特林数:https://www.cnblogs.com/Wuweizhen ...
- 【BZOJ4555】【TJOI2016】【HEOI2016】求和 (第二类斯特林数+NTT卷积)
Description 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: $$f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\tim ...
- bzoj5093:图的价值(第二类斯特林数+NTT)
传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...
- P4091 [HEOI2016/TJOI2016]求和(第二类斯特林数+NTT)
传送门 首先,因为在\(j>i\)的时候有\(S(i,j)=0\),所以原式可以写成\[Ans=\sum_{i=0}^n\sum_{j=0}^nS(i,j)\times 2^j\times j! ...
随机推荐
- 有关kali更新源时出现的GPG数字证书无效提示的解决方法
下载并导入key文件 wget -O - https://archive.kali.org/archive-key.asc |apt-key add 显示ok表示成功导入key,然后再进行之后的其他步 ...
- 【C#】上机实验八
1. 设计一个窗体应用程序,模拟写字板应用程序的基本功能.具体功能要求如下: (1)“文件”菜单中有“新建”.“打开”.“保存”.“退出”子菜单. (2)“编辑”菜单中有“剪切”.“复制”.“粘贴”. ...
- mysql_select 多表查询
一.等值连接 原理:将多张单表组成一张逻辑大表 语法: select * from 表A,表B where 表A.主键=表B.外键 and 查询条件 select * from 表A,表B ...
- fastjson反序列化使用不当导致内存泄露
分析一个线上内存告警的问题时,发现了造成内存告警的原因是使用fastjson不当导致的. 分析dump发现com.alibaba.fastjson.util.IdentityHashMap$Entry ...
- [LOJ3086] [GXOI2019] 逼死强迫症
题目链接 LOJ:https://loj.ac/problem/3086 洛谷:https://www.luogu.org/problemnew/show/P5303 Solution 显然不考虑\( ...
- [洛谷P5377][THUPC2019]鸽鸽的分割
题目大意:有一个圆,圆上有$n$个点,将这几个点两两连接,问最多分成几部分 题解:发现这相当于一个平面图,由欧拉公式得($F$为平面分割块数,$E$为平面图边数,$V$为平面图点数):$$F=E-V+ ...
- THUSC2019:Illusory World
拿了1=就来更 Update:没约咕了
- JAVA的枚举基本操作,对原码反码补码的理解及为运算的深入理解,浮点数计算的误差分析
①深入浅出的了解枚举类型 先看一段代码: enum Size{SMALL,MEDIUM,LARGE}; public class EnumTest { public static void main( ...
- Java8新特性——Lambda表达式-1
一.抛出需求 超市中挑选苹果,挑选条件多样化. 示例:找出绿色并且重量等于150的苹果,找出红色并且重量小于120苹果. 1.苹果类 public class Apple { private Stri ...
- 导出Excel的2个方法
导出到Excel的两种方法 第一种: 1.首先创建Excle模板,另存为 “xml”文件.使用记事本等编辑软件打开文件的代码.然后另存为视图文件“Export.cshtml”; 2.控制器操作 pub ...