【题解】幼儿园篮球题(NTT+范德蒙德卷积+斯特林数)

题目就是要我们求一个式子(听说叫做超几何分布?好牛逼的名字啊)

\[\sum_{i=1}^{S}\dfrac 1 {N \choose n_i}\sum_{j=0}^{k_i}{m_i \choose j}{n_i-m_i\choose k_i- j}j^L
\]

实际上$S $很小,所以本质上就是求

\[\sum_{j=0}^{k_i}{m_i \choose j}{n_i-m_i\choose k_i- j}j^L
\]

为了方便我写成这个形式

\[\sum_{j=0}^{k}{m \choose j}{n-m\choose k-j}j^L
\]

斯特林数划开次方

\[\sum_{j=0}^{k}{m \choose j}{n-m\choose k-j}\sum_{i=0}^{\min\{j,L\}}{L \brace i}{j \choose i}i!
\]

交换和式

\[\sum_{i=0}^{\min \{k,L\}}{L \brace i}i!\sum_{j=0}^{\min\{k,L\}}{j \choose i}{m\choose j}{n-m\choose k-j}
\]

备胎模型提一下

\[\sum_{i=0}^{\min \{k,L\}}{L \brace i}i!{m \choose i}\sum_{j=0}^{\min\{k,L\}}{m-i\choose j-i} {n-m\choose k-j}
\]

根据黑白模型,提出来(这个还有一个名字叫做范德蒙德卷积)

\[\sum_{i=0}^{\min \{k,L\}}{L \brace i}i!{m \choose i}{n-i\choose k-i}
\]

而\(L \le 2\times 10^5\)

回顾一下求斯特林数

\[{L\brace i}=\dfrac 1{i!}\sum_{j=0}^{i-1}(-1)^{j}{i\choose j}(i-j)^{L}
\]

NTT预处理就好了

仍然不想写代码...什么时候想了就贴一下

upd:补锅

//@winlere
#include<iostream>
#include<cstdio> using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
} namespace poly{
const int maxn=1<<19|1;
int r[maxn]; inline void getr(const int&len){
static int sav=0;
if(len==sav) return;
int cnt=0;
for(register int t=1;t<len;t<<=1)++cnt;
for(register int t=0;t<len;++t) r[t]=r[t>>1]>>1|(t&1)<<cnt>>1;
}
const int mod=998244353;
const int g=3;
inline int ksm(const int&base,const int&p){
register int ret=1;
for(register int t=p,b=base%mod;t;t>>=1,b=1ll*b*b%mod)
if(t&1) ret=1ll*b*ret%mod;
return ret;
}
const int gi=ksm(3,mod-2);
inline void NTT(int*a,const int&len,const int&tag){
int*a0,*a1,s=g;
if(tag!=1) s=gi;
getr(len);
for(register int t=0;t<len;++t) if(t<r[t])swap(a[t],a[r[t]]);
for(register int t=1,wn;t<len;t<<=1){
wn=ksm(s,(mod-1)/(t<<1));
for(register int i=0;i<len;i+=t<<1){
a1=(a0=a+i)+t;
for(register int k=0,w=1,m;k<t;++k,++a1,++a0,w=1ll*w*wn%mod){
m=1ll**a1*w%mod;
*a1=(*a0+mod-m)%mod;
*a0=(*a0+m)%mod;
}
}
}
if(tag!=1) for(register int t=0,w=ksm(len,mod-2);t<len;++t) a[t]=1ll*a[t]*w%mod;
}
}
using namespace poly;
const int maxn2=2e7+3;
int s[maxn],t1[maxn],t2[maxn];
int jc[maxn2],inv[maxn2];
int n,m,S,L; inline void pre(const int&n){
jc[0]=inv[0]=1;
for(register int t=1;t<=n;++t) jc[t]=1ll*jc[t-1]*t%mod;
inv[n]=ksm(jc[n],mod-2);
for(register int t=n-1;t;--t) inv[t]=1ll*inv[t+1]*(t+1)%mod;
for(register int t=0;t<=L;++t) {
t1[t]=inv[t];
if(t&1) t1[t]=mod-t1[t];
t2[t]=1ll*inv[t]*ksm(t,L)%mod;
}
int k=1;
while(k<=L)k<<=1;
NTT(t1,k<<1,1);
NTT(t2,k<<1,1);
for(register int t=0,ed=k<<1;t<ed;++t)s[t]=1ll*t1[t]*t2[t]%mod;
NTT(s,k<<1,-1);
for(register int t=L+1;t<k<<1;++t) s[t]=0;
} inline int c(const int&n,const int&m){
if(n<m)return 0;
return 1ll*jc[n]*inv[m]%mod*inv[n-m]%mod;
} inline int getans(const int&nn,const int&mm,const int&kk){
int ret=0;
for(register int t=0,ed=min(min(L,kk),min(nn,mm));t<=ed;++t)
ret=(ret+1ll*s[t]*inv[mm-t]%mod*jc[nn-t]%mod*inv[kk-t]%mod)%mod;
return 1ll*ret*inv[nn]%mod*jc[mm]%mod*jc[kk]%mod;
} int main(){
n=qr();m=qr();S=qr();L=qr();
pre(max(max(L,m),n));
for(register int t=1,t1,t2,t3;t<=S;++t){
t1=qr();t2=qr();t3=qr();
printf("%d\n",getans(t1,t2,t3));
}
return 0;
}

【题解】幼儿园篮球题(范德蒙德卷积+斯特林+NTT)的更多相关文章

  1. bzoj 4830: [Hnoi2017]抛硬币 [范德蒙德卷积 扩展lucas]

    4830: [Hnoi2017]抛硬币 题意:A投a次硬币,B投b次硬币,a比b正面朝上次数多的方案数,模\(10^k\). \(b \le a \le b+10000 \le 10^{15}, k ...

  2. 洛谷 P2791 幼儿园篮球题

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

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

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

  4. Codeforces 785D - Anton and School - 2 - [范德蒙德恒等式][快速幂+逆元]

    题目链接:https://codeforces.com/problemset/problem/785/D 题解: 首先很好想的,如果我们预处理出每个 "(" 的左边还有 $x$ 个 ...

  5. Luogu2791 幼儿园篮球题【斯特林数,数学】

    题目链接:洛谷 我一开始不知道$N,M$有什么用处,懵逼了一会儿,结果才发现是输入数据范围... $$\begin{aligned}\binom{n}{k}Ans&=\sum_{i=0}^k\ ...

  6. 【洛谷2791】幼儿园篮球题(第二类斯特林数,NTT)

    [洛谷2791]幼儿园篮球题(第二类斯特林数,NTT) 题面 洛谷 题解 对于每一组询问,要求的东西本质上就是: \[\sum_{i=0}^{k}{m\choose i}{n-m\choose k-i ...

  7. 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

  8. 【洛谷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\leqsla ...

  9. luogu P2791 幼儿园篮球题

    传送门 先看我们要求的是什么,要求的期望就是总权值/总方案,总权值可以枚举进球的个数\(i\),然后就应该是\(\sum_{i=0}^{k} \binom{m}{i}\binom{n-m}{k-i}i ...

随机推荐

  1. jQuery 练习 dom

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. redux之createStore方法底层封装模拟

    首先在看代码之前让我们一起回顾下redux的思想吧   首先redux就是一个MVC思想的框架,他总体是遵循数据的单向流动自顶向下流动 在我们仓库中有一个initState用来存储着我们的初始数据 另 ...

  3. @loj - 2289@「THUWC 2017」在美妙的数学王国中畅游

    目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个点编号 0 到 n-1,每个点有一个从 [0,1] 映射到 ...

  4. WPS修订功能的使用

    WPS设置 设置用户名: 修改之后的效果:

  5. phpstudy一直使用php5.6版本一直“”“报错应用程序无法正常启动0xc000007b”,亲测可行

    http://www.php.cn/xiazai/gongju/1351 vc9和vc11-vc14运行库 2018-01-26 来源/作者:php中文网 «» 下载次数:7808 工具简介: php ...

  6. 随机线性网络编码的C语言实现,实现可靠传输:原理(1)

    线性方程组,大家都不陌生吧.来一组 A11 *X1 + A12 *X2 + A13 *X3 + A14 *X4 =Q1 A21 *X1 + A22 *X2 + A23 *X3 + A24 *X4 =Q ...

  7. H3C ICMP

  8. Educational Codeforces Round 12 B C题、

    B. Shopping 题意:n个顾客,每个顾客要买m个物品,商场总共有k个物品,看hint就只知道pos(x)怎么算了,对于每一个Aij在k个物品中找到Aij的位置.然后加上这个位置对于的数值,然后 ...

  9. NIO 中文乱码自我解决的简单DEMO

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStrea ...

  10. python新知识

    # 强制字符串转化 repr(1.1 + 2.2) # 字符串换行 a = "hello, world. " \ "it's a nice day. " \ & ...