【题解】幼儿园篮球题(范德蒙德卷积+斯特林+NTT)
【题解】幼儿园篮球题(NTT+范德蒙德卷积+斯特林数)
题目就是要我们求一个式子(听说叫做超几何分布?好牛逼的名字啊)
\]
实际上$S $很小,所以本质上就是求
\]
为了方便我写成这个形式
\]
斯特林数划开次方
\]
交换和式
\]
备胎模型提一下
\]
根据黑白模型,提出来(这个还有一个名字叫做范德蒙德卷积)
\]
而\(L \le 2\times 10^5\)
回顾一下求斯特林数
\]
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)的更多相关文章
- bzoj 4830: [Hnoi2017]抛硬币 [范德蒙德卷积 扩展lucas]
4830: [Hnoi2017]抛硬币 题意:A投a次硬币,B投b次硬币,a比b正面朝上次数多的方案数,模\(10^k\). \(b \le a \le b+10000 \le 10^{15}, k ...
- 洛谷 P2791 幼儿园篮球题
洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...
- 洛谷 P2791 - 幼儿园篮球题(第二类斯特林数)
题面传送门 首先写出式子: \[ans=\sum\limits_{i=0}^m\dbinom{m}{i}\dbinom{n-m}{k-i}·i^L \] 看到后面有个幂,我们看它不爽,因此考虑将其拆开 ...
- Codeforces 785D - Anton and School - 2 - [范德蒙德恒等式][快速幂+逆元]
题目链接:https://codeforces.com/problemset/problem/785/D 题解: 首先很好想的,如果我们预处理出每个 "(" 的左边还有 $x$ 个 ...
- Luogu2791 幼儿园篮球题【斯特林数,数学】
题目链接:洛谷 我一开始不知道$N,M$有什么用处,懵逼了一会儿,结果才发现是输入数据范围... $$\begin{aligned}\binom{n}{k}Ans&=\sum_{i=0}^k\ ...
- 【洛谷2791】幼儿园篮球题(第二类斯特林数,NTT)
[洛谷2791]幼儿园篮球题(第二类斯特林数,NTT) 题面 洛谷 题解 对于每一组询问,要求的东西本质上就是: \[\sum_{i=0}^{k}{m\choose i}{n-m\choose k-i ...
- 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理
浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...
- 【洛谷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 ...
- luogu P2791 幼儿园篮球题
传送门 先看我们要求的是什么,要求的期望就是总权值/总方案,总权值可以枚举进球的个数\(i\),然后就应该是\(\sum_{i=0}^{k} \binom{m}{i}\binom{n-m}{k-i}i ...
随机推荐
- Python基础:17类和实例之一(类属性和实例属性)
1:类通常在一个模块的顶层进行定义.对于Python来说,声明与定义类是同时进行的. 2:类属性仅与其类相绑定,类数据属性仅当需要有更加“静态”数据类型时才变得有用,这种属性是静态变量.它们表示这些数 ...
- @atcoder - AGC036D@ Negative Cycle
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N 个点的有向带权图,从 0 编号到 N - 1.一开 ...
- HZOJ Function
比较神仙的一道dp,考试的时候还以为是打表找规律啥的. 我们重新描述一下这道题:一个10 9 × n的网格,每个格子有一个权值,每一列格子的权值都是相同的.从一个起点开始,每次可以向上走一格或者向左上 ...
- Open Source GIS and Freeware GIS Applications
Open Source GIS and Freeware GIS Applications An open source application by definition is software ...
- React事件用法
一.事件处理函数的使用 1.1 绑定事件处理函数 1.2 使用 <HelloWorld onClick={this.handleClick}/> 大括号中指定的是this对象即当前组件引用 ...
- Nginx 的 location
一.location语法 语法: Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: — ...
- LRJ 3-7
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> int main() { int T; int m, n; ][]; // 4 < ...
- HDU 1026 BSF+优先队列+记录路径、
#include<iostream> #include<cmath> #include<cstring> #include<cstdio> #inclu ...
- Pytorch 多 GPU 并行处理机制
Pytorch 的多 GPU 处理接口是 torch.nn.DataParallel(module, device_ids),其中 module 参数是所要执行的模型,而 device_ids 则是指 ...
- window10+python3.7安装tensorflow--gpu tensorflow 安装
能安装GPU的前提是:1.显卡支持CUDA (1)右击我的电脑–属性 (2)打开设备管理器 (3)显示适配器 我的电脑是支持CUDA的 2.pip 版本 >= 8.1查看pip版本 :pip ...