【题解】幼儿园篮球题(范德蒙德卷积+斯特林+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 ...
随机推荐
- jq 监听返回事件
<script> $(document).ready(function(e) { var counter = 0; if (window.hi ...
- iptables 网址转译 (Network Address Translation,NAT)
当封包流经NAT電腦時,其位址/通訊端口會被修改,以達到改变包目的地(或旅程),或是让目的地误以为包是源自NAT电脑的效果.換言之,对封包执行NAT的电脑,可以成为新包的来源或目的地,或是成为真正来源 ...
- canvas简单动画
实现场景:定义一个1000*800的方框,圆球在其中移动,碰撞到边框弹回的动画.方框背景是半径为10的小圆球组成.鼠标移动到移动圆球时,圆球停止运动. html代码: <div> < ...
- apply、call、bind方法调用
---恢复内容开始--- 首先这三个方法的作用都是用来改变this的值,而this的值一般有几种情况. 1.函数作为一个对象的一个方法来调用,此时this的值指向对象. var a={ v:0; f: ...
- 【原生JS】动态分页样式效果
效果图如下: html: <body> <div> <table id="btnbox"> <tbody> <tr>&l ...
- 评分模型的检验方法和标准通常有:K-S指标、交换曲线、AR值、Gini数等。例如,K-S指标是用来衡量验证结果是否优于期望值,具体标准为:如果K-S大于40%,模型具有较好的预测功能,发展的模型具有成功的应用价值。K-S值越大,表示评分模型能够将“好客户”、“坏客户”区分开来的程度越大。
评分模型的检验方法和标准通常有:K-S指标.交换曲线.AR值.Gini数等.例如,K-S指标是用来衡量验证结果是否优于期望值,具体标准为:如果K-S大于40%,模型具有较好的预测功能,发展的模型具有成 ...
- [转]C# 语言历史版本特性(C# 1.0到C# 8.0汇总)
历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECM ...
- SAX解析xml (遍历DOM树各节点)
本文参考 http://yangjunfeng.iteye.com/blog/401377 1. books.xml <?xml version="1.0" encoding ...
- nginx调用PHP有sock方式和端口方式
nginx调用PHP有sock方式和端口方式 1.确认nginx已经调用了php;2.先确认你的nginx使用什么方式调用PHP:3.如果使用端口方式,端口对不对应,如果使用SOCK方式,那么路径对不 ...
- Linux 基础(一)stat函数
Header file: #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> DEFI ...