【题解】幼儿园篮球题(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. window执行python文件

    @echo offD:cd D:\pythonstart python2 del.pyexit

  2. 高二小假期集训—D5

    刚调完了一个非常恶心的题(可能是我写的太恶心了),心累……先写会博客吧. 今天上午该完了考试的三道题,感觉第二道真的是个好题(学长说是经常会遇到的一类题……完了完了),看了一个小时std才看懂,写了篇 ...

  3. saltStack_template

    模版使用 新建文件:vim dns.sls   vim file/resolv.conf   执行 : [root@server_client base]# salt \* state.sls dns ...

  4. jq获取单选框、复选框、下拉菜单的值

    1.<input type="radio" name="testradio" value="jquery获取radio的值" /> ...

  5. Google Colab 免费GPU服务器使用教程 挂载云端硬盘

    一.前言二.Google Colab特征三.开始使用3.1在谷歌云盘上创建文件夹3.2创建Colaboratory3.3创建完成四.设置GPU运行五.运行.py文件5.1安装必要库5.2 挂载云端硬盘 ...

  6. jieba分词流程及部分源码解读(一)

    首先我们来看一下jieba分词的流程图: 结巴中文分词简介 1)支持三种分词模式: 精确模式:将句子最精确的分开,适合文本分析 全模式:句子中所有可以成词的词语都扫描出来,速度快,不能解决歧义 搜索引 ...

  7. elasticsearch-倒排索引原理

    倒排索引 Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索.一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表. 例如,假设我们有两个 ...

  8. 洛谷P5022 旅行 题解 去环/搜索

    题目链接:https://www.luogu.org/problem/P5022 这道题目一开始看的时候没有思路,但是看到数据范围里面有一个: \(m = n-1\) 或 \(m = n\) ,一下子 ...

  9. Python--day65--模板语言之filter

    参考的原文链接:http://www.cnblogs.com/liwenzhou/p/7931828.html Filters(过滤器) 在Django的模板语言中,通过使用 过滤器 来改变变量的显示 ...

  10. 定位问题 vue+element-ui+easyui(兼容性)

    项目背景:靠近浏览器窗口的各个方向(左上.下.左.右)都有不同的模态框悬浮于窗口,这里针对于底部组件定位的选择(主要针对pc端垂直方向上的定位) 1.百分比:easyui的window窗口定位方式:设 ...