题目

\(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. OpenResty中如何实现,按QPS、时间范围、来源IP进行限流

    OpenResty是一个基于Nginx与Lua的高性能Web平台,它通过LuaJIT在Nginx中运行高效的Lua脚本和模块,可以用来处理复杂的网络请求,并且支持各种流量控制和限制的功能. 近期研究在 ...

  2. 记一次 splice 导致 io.Copy 阻塞的排查过程

    记一次 splice 导致 io.Copy 阻塞的排查过程 简而言之,net.TCPConn 的 ReadFrom 零拷贝实现 splice 在 1.21.0 - 1.21.4 删除了 SPLICE_ ...

  3. cmake安装及报错解决办法

    安装 yum install cmake 报错 centOS8(x86_64 或 aarch64) 系统下 yum或dnf 默认安装的 cmake-3.18.2-11.el8版本,安装后无法使用,出现 ...

  4. c# rdkafka 设置偏移量(offset)

    参考资料: librdkafka: 如何设置Kafka消费者订阅消息的起始偏移位置 领导要求kafka消费者端消费最新的数据. 不知道怎么设置偏移量,查了资料. 用惯了封装好的东西,都不知道怎么设置了 ...

  5. 2-Django之三板斧

    HttpResponse 返回字符串类型的数据 HttpResponse: 这是 Django 自带的类,用于构建基本的 HTTP 响应 我的app名称是demo,我们先按照正常的流程,在views中 ...

  6. JavaScript之原生ajax && jQuery之ajax

        ajax提供了异步访问服务器的方法,使页面无须刷新就可以更改页面内容,在实际情况中使用原生的情况较少但是原理需要掌握,一般都是使用jquey更轻量级的实现ajax但是原理是共同的.     原 ...

  7. 【Azure Redis】Azure Redis添加了内部虚拟网络后,其他区域的主机通过虚拟网络对等互连访问失败

    问题描述 跨区域无法访问Azure Redis服务, Redis 启用了Network并设置在一个VNET中,现在客户端部署在另一个区域数据中心中,两个数据中心区域使用VNET Peer(对等互连)访 ...

  8. 【Azure Redis Cache】对StackExchange.Redis IOCP错误消息的解读

    问题描述 在使用StackExchange.Redis连接到Azure Redis服务时,时常出现StackExchange.Redis.RedisTimeoutException异常. 全部错误消息 ...

  9. linux系统信息命令笔记

    1,时间和日期 2,磁盘信息 4,进程概念介绍 4.1,ps 基本命令使用 ps aux 显示内容太多了.一般用ps a 或 ps au 4.2, top命令的基本使用 top 可以动态的显示运行中的 ...

  10. court 法院 单词记忆

    court 围绕得到 - 法院 讨好 c 表示得到 catch助记 ourt = turn = around = 围绕 围绕得到某一事物的地方或者行为 英[kɔːt],美[kɔrt] n. 法院, 法 ...