题目

\(T(T\leq 200)\)组数据求

\[\frac{1}{C(n,k)}\sum_{i=0}^kC(m,i)C(n-m,k-i)i^L
\]

对于所有数据满足 \(n,m,k\leq 2*10^7,L\leq 2*10^5\)


分析

主要是这个 \(L\) 次方的问题,考虑用第二类斯特林数转化一下,就是

\[=\frac{1}{C(n,k)}\sum_{i=0}^kC(m,i)C(n-m,k-i)\sum_{j=0}^L Stir(L,j)*j!*C(i,j)
\]

提到前面去就是

\[=\frac{1}{C(n,k)}\sum_{j=0}^L Stir(L,j)*j!\sum_{i=0}^k C(m,i)C(n-m,k-i)C(i,j)
\]

考虑 \(C(m,i)C(i,j)=C(m,j)C(m-j,i-j)\),那么

\[=\frac{1}{C(n,k)}\sum_{j=0}^L Stir(L,j)*j!C(m,j)\sum_{i=0}^k C(m-j,i-j)C(n-m,k-i)
\]

利用范德蒙德卷积可以得到

\[=\frac{1}{C(n,k)}\sum_{j=0}^L Stir(L,j)*j!C(m,j)C(n-j,k-j)
\]

用NTT维护一行的第二类斯特林数即可


代码

#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstring>
#include <algorithm>
#define mem(f,n) memset(f,0,sizeof(int)*(n))
#define cpy(f,g,n) memcpy(f,g,sizeof(int)*(n))
using namespace std;
const int mod=998244353,N=400011,inv3=332748118;
typedef long long lll; typedef unsigned long long ull;
int n,m,Gmi[31],Imi[31],T,L,len,ff[N<<2],gg[N<<2],tt[N<<2],inv[N*50],fac[N*50];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
int ksm(int x,int y){
int ans=1;
for (;y;y>>=1,x=1ll*x*x%mod)
if (y&1) ans=1ll*ans*x%mod;
return ans;
}
namespace Theoretic{
int rev[N<<2],LAST; ull Wt[N<<2],F[N<<2];
void Pro(int n){
if (LAST==n) return; LAST=n,Wt[0]=1;
for (int i=0;i<n;++i)
rev[i]=(rev[i>>1]>>1)|((i&1)?n>>1:0);
}
void NTT(int *f,int n,int op){
Pro(n);
for (int i=0;i<n;++i) F[i]=f[rev[i]];
for (int o=1,len=1;len<n;++o,len<<=1){
int W=(op==1)?Gmi[o]:Imi[o];
for (int j=1;j<len;++j) Wt[j]=Wt[j-1]*W%mod;
for (int i=0;i<n;i+=len+len)
for (int j=0;j<len;++j){
int t=Wt[j]*F[i|j|len]%mod;
F[i|j|len]=F[i|j]+mod-t,F[i|j]+=t;
}
if (o==10) for (int j=0;j<n;++j) F[j]%=mod;
}
if (op==-1){
int invn=ksm(n,mod-2);
for (int i=0;i<n;++i) F[i]=F[i]%mod*invn%mod;
}else for (int i=0;i<n;++i) F[i]%=mod;
for (int i=0;i<n;++i) f[i]=F[i];
}
void Cb(int *f,int *g,int n){
for (int i=0;i<n;++i) f[i]=1ll*f[i]*g[i]%mod;
}
}
void GmiImi(){
for (int i=0;i<31;++i) Gmi[i]=ksm(3,(mod-1)/(1<<i));
for (int i=0;i<31;++i) Imi[i]=ksm(inv3,(mod-1)/(1<<i));
}
int main(){
n=iut(),m=iut(),T=iut(),L=iut(); if (n<L) n=L;
inv[0]=inv[1]=fac[0]=fac[1]=1,GmiImi();
for (int i=2;i<=n;++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for (int i=2;i<=n;++i) fac[i]=1ll*fac[i-1]*i%mod,inv[i]=1ll*inv[i-1]*inv[i]%mod;
for (int i=0;i<=L;++i) ff[i]=1ll*((i&1)?mod-1:1)*inv[i]%mod,gg[i]=1ll*ksm(i,L)*inv[i]%mod;
for (len=1;len<L+L+2;len<<=1); cpy(tt,gg,len);
Theoretic::NTT(ff,len,1),Theoretic::NTT(tt,len,1),
Theoretic::Cb(ff,tt,len),Theoretic::NTT(ff,len,-1);
mem(ff+L+1,len-L-1),mem(tt,len);
for (int j=1;j<=T;++j){
int _n=iut(),_m=iut(),_k=iut(),ans=0,lim=min(_k,min(_m,L));
for (int i=0;i<=lim;++i) ans=(ans+1ll*ff[i]*inv[_m-i]%mod*fac[_n-i]%mod*inv[_k-i])%mod;
ans=1ll*ans*fac[_m]%mod*fac[_k]%mod*inv[_n]%mod;
print(ans),putchar(10);
}
return 0;
}

#范德蒙德卷积,第二类斯特林数,NTT#洛谷 2791 幼儿园篮球题的更多相关文章

  1. 【BZOJ4555】【TJOI2016】【HEOI2016】求和 (第二类斯特林数+NTT卷积)

    Description 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: $$f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\tim ...

  2. bzoj5093:图的价值(第二类斯特林数+NTT)

    传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...

  3. BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】

    题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...

  4. BZOJ4555 [Tjoi2016&Heoi2016]求和 【第二类斯特林数 + NTT】

    题目 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + ...

  5. bzoj 5093 图的价值 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 每个点都是等价的,从点的贡献来看,得到式子: \( ans = n * \sum\li ...

  6. bzoj 4555 [Tjoi2016&Heoi2016] 求和 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 关于第二类斯特林数:https://www.cnblogs.com/Wuweizhen ...

  7. 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! ...

  8. BZOJ 4555:[TJOI2016&HEOI2016]求和(第二类斯特林数+NTT)

    题目链接 \(Description\) 求 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)2^jj!\]对998244353取模后的结果. \(n<=10^5\) \(Sol ...

  9. BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT

    定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...

  10. 洛谷 P2791 - 幼儿园篮球题(第二类斯特林数)

    题面传送门 首先写出式子: \[ans=\sum\limits_{i=0}^m\dbinom{m}{i}\dbinom{n-m}{k-i}·i^L \] 看到后面有个幂,我们看它不爽,因此考虑将其拆开 ...

随机推荐

  1. less变量书写及样式混入

    定义变量 定义混入样式 变量及混入样式使用 样式文件中   ~@代表src

  2. Programming Abstractions in C阅读笔记:p293-p302

    <Programming Abstractions in C>学习第73天,p293-p302总结,总计10页. 一.技术总结 1.时间复杂度 (1)quadratic time(二次时间 ...

  3. [软件工程] CMMI是什么?

    序 能力成熟度模型集成(CMMI) 一.CMMI(能力成熟度模型集成)概述 CMMI是由美国软件工程学会(software engineering institue,简称SEI)制定的一套专门针对软件 ...

  4. 新来个架构师,用48张图把OpenFeign原理讲的炉火纯青~~

    大家好,我是三友~~ 在很久之前,我写过两篇关于OpenFeign和Ribbon这两个SpringCloud核心组件架构原理的文章 但是说实话,从我现在的角度来看,这两篇文章的结构和内容其实还可以更加 ...

  5. 全面掌握Directory.Build.props

    为什么需要集中管理版本号? 1)同一个产品包含多个模块,对同一个包指定了不同的版本 比如A模块用了"Serilog.Sinks.Async"的"1.1.2"版本 ...

  6. 【Azure 应用服务】PHP项目部署到App Service for Linux环境中,如何修改上传文件大小的限制呢?

    问题描述 PHP项目部署到App Service for Linux环境中,如何修改上传文件大小的限制呢? 问题解答 经过查询Azure App Service官方文档,可能通过在项目根目录下添加.h ...

  7. IDEA 报错 project is already registered

    1.环境&背景 有时候IEDA下一个工程中想引入多个项目,只能添加多个modules. 版本:IDEA 2020.2 构建:gradle 2.问题 有时候删掉了某个项目再导入时报错 proje ...

  8. Failed to instantiate [applets.nature.mapper.LogInfoMapper]: Specified class is an interface-项目启动报错

    一.问题由来 周日下午项目在进行测试时,有些东西需要临时修改,自己已经打好一个包部署到测试服务器进行部署.在测试过程中发现一个问题,就是 现在的代码跑起来是没问题的,只是其他人又的东西还没做,所以暂时 ...

  9. 正则表达式 <h2>kk</h2> 替换为 <h2 id="kk">kk</h2>

    `<h2>kk</h2><h2>k333k</h2>`.replace(/\<h2>(.*?)<\/h2>/g, `<h2 ...

  10. react start 后 url 后面不带/ 解决思路

    > navigator@0.1.0 dev H:\2020home\giteez\navigator > node scripts/start.js Compiled successful ...