luogu P2791 幼儿园篮球题
先看我们要求的是什么,要求的期望就是总权值/总方案,总权值可以枚举进球的个数\(i\),然后就应该是\(\sum_{i=0}^{k} \binom{m}{i}\binom{n-m}{k-i}i^l\),总方案是\(\binom{n}{k}\)
直接做显然不行,然后式子里有个\(i^l\),把它拆开,也就是\(\sum_{j=0}^{l} \binom{i}{j}S_{l,j}j!\),代入原式$$\sum_{i=0}{k}\binom{m}{i}\binom{n-m}{k-i}\sum_{j=0}{l} \binom{i}{j}S_{l,j}j!$$$$\sum_{j=0}^{l} S_{l,j}j!\sum_{i=0}{k}\binom{m}{i}\binom{i}{j}\binom{n-m}{k-i}$$$$\sum_{j=0}{l} S_{l,j}j!\sum_{i=0}{k}\binom{m}{j}\binom{m-j}{i-j}\binom{n-m}{k-i}$$$$\sum_{j=0}{l} S_{l,j}j!\binom{m}{j}\sum_{i=0}{k}\binom{m-j}{i-j}\binom{n-m}{k-i}$$$$\sum_{j=0}{l} S_{l,j}j!\binom{m}{j}\binom{n-j}{k-j}$$
然后只要能快速预处理出\(S_{l,j}\)就能做了.考虑组合意义$$S_{n,m}=\frac{1}{m!}\sum_{i=0}{m}(-1)i\binom{m}{i}(m-i)n$$$$S_{n,m}=\sum_{i=0}{m}\frac{(-1)i}{i!}\frac{(m-i)n}{(m-i)!}$$
卷积即可
这题可能有点卡常,注意简化运算
// luogu-judger-enable-o2
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#include<set>
#define LL long long
#define db double
using namespace std;
const int N=2e7+10,M=550000+10,mod=998244353;
LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int fpow(int a,int b){int an=1;while(b){if(b&1) an=1ll*an*a%mod;a=1ll*a*a%mod,b>>=1;} return an;}
int inv(int a){return fpow(a,mod-2);}
int fac[N],iac[N],rdr[M];
void ntt(int *a,int n,bool op)
{
int x,y;
for(int i=0;i<n;++i)
if(i<rdr[i]) swap(a[i],a[rdr[i]]);
for(int i=1;i<n;i<<=1)
{
int ww=fpow(op?3:332748118,(mod-1)/(i<<1));
for(int j=0;j<n;j+=i<<1)
for(int k=0,w=1;k<i;++k,w=1ll*w*ww%mod)
x=a[j+k],y=1ll*a[j+k+i]*w%mod,a[j+k]=(x+y)%mod,a[j+k+i]=(x-y+mod)%mod;
}
if(!op) for(int i=0,w=inv(n);i<n;++i) a[i]=1ll*a[i]*w%mod;
}
int C(int n,int m){return m<0||n<m?0:1ll*fac[n]*iac[m]%mod*iac[n-m]%mod;}
int n,m,s,l,aa[M],bb[M],prm[M>>1],tt;
bool v[M];
int main()
{
n=rd(),m=rd(),s=rd(),l=rd();
fac[0]=1;
int lm=max(n,l);
for(int i=1;i<=lm;++i) fac[i]=1ll*fac[i-1]*i%mod;
iac[lm]=inv(fac[lm]);
for(int i=lm;i;--i) iac[i-1]=1ll*iac[i]*i%mod;
bb[1]=1;
for(int i=2;i<=l;++i)
{
if(!v[i]) prm[++tt]=i,bb[i]=fpow(i,l);
for(int j=1;j<=tt&&i*prm[j]<=l;++j)
{
v[i*prm[j]]=1;
bb[i*prm[j]]=1ll*bb[i]*bb[prm[j]]%mod;
if(i%prm[j]==0) break;
}
}
for(int i=0;i<=l;++i)
aa[i]=(i&1)?mod-iac[i]:iac[i];
for(int i=0;i<=l;++i)
bb[i]=1ll*bb[i]*iac[i]%mod;
int len=1,ms=0;
while(len<=l+l) len<<=1,++ms;
for(int i=0;i<len;++i) rdr[i]=(rdr[i>>1]>>1)|((i&1)<<(ms-1));
ntt(aa,len,1),ntt(bb,len,1);
for(int i=0;i<len;++i) aa[i]=1ll*aa[i]*bb[i]%mod;
ntt(aa,len,0);
while(s--)
{
int nn=rd(),mm=rd(),kk=rd(),ans=0,lim=min(min(l,kk),mm);
for(int i=0;i<=lim;++i)
ans=(ans+1ll*aa[i]/**fac[i]%mod*iac[i]%mod*/*iac[mm-i]%mod*fac[nn-i]%mod*iac[kk-i]%mod)%mod;
ans=1ll*ans*inv(C(nn,kk))%mod*fac[mm]%mod*(nn>=kk?iac[nn-kk]:0)%mod;
printf("%d\n",ans);
}
return 0;
}
luogu P2791 幼儿园篮球题的更多相关文章
- 洛谷 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 \] 看到后面有个幂,我们看它不爽,因此考虑将其拆开 ...
- 【洛谷2791】幼儿园篮球题(第二类斯特林数,NTT)
[洛谷2791]幼儿园篮球题(第二类斯特林数,NTT) 题面 洛谷 题解 对于每一组询问,要求的东西本质上就是: \[\sum_{i=0}^{k}{m\choose i}{n-m\choose k-i ...
- 【题解】幼儿园篮球题(范德蒙德卷积+斯特林+NTT)
[题解]幼儿园篮球题(NTT+范德蒙德卷积+斯特林数) 题目就是要我们求一个式子(听说叫做超几何分布?好牛逼的名字啊) \[ \sum_{i=1}^{S}\dfrac 1 {N \choose n_i ...
- [LGP2791] 幼儿园篮球题
你猜猜题怎么出出来的? 显然第\(i\)场的答案为 \[ \frac{1}{\binom{n_i}{m_i}\binom{n_i}{k_i}}\sum_{x=0}^{k_i}\binom{n_i}{m ...
- 【洛谷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 ...
- Luogu2791 幼儿园篮球题【斯特林数,数学】
题目链接:洛谷 我一开始不知道$N,M$有什么用处,懵逼了一会儿,结果才发现是输入数据范围... $$\begin{aligned}\binom{n}{k}Ans&=\sum_{i=0}^k\ ...
- Luogu P2756 [网络流24题]飞行员配对方案问题_二分图匹配
二分图模板题 我用的是匈牙利 其实最大流也可以做 #include<iostream> #include<cstdio> #include<cstdlib> #in ...
- 【题解】 Luogu P4145 上帝造题的七分钟2 / 花神游历各国
原题传送门 这道题实际和GSS4是一样的,只是输入方式有点区别 GSS4传送门 这道题暴力就能过qaq(这里暴力指线段树) 数据比较水 开方修改在线段树中枚举叶节点sqrt 查询区间和线段树基本操作 ...
随机推荐
- sudo密码一直出错
Linux默认是没有将用户添加到sudoers列表中的,需要root手动将账户添加到sudoers列表中,才能让普通账户执行sudo命令. 所以要将用户添加到sudoers组中,才能执行sudo命令, ...
- git设置mergetool可视化工具
可以设置BeyondCompare,DiffMerge等作为git的比较和合并的可视化工具,方便操作. 设置如下: 先下载并安装BeyondCompare,DiffMerge等. 设置git配置, ...
- jQuery .delay()
.delay() Effects > Custom .delay( duration [, queueName ] )Returns: jQuery Description: Set a tim ...
- 展示组件(Presentational component)和容器组件(Container component)之间有何不同
展示组件关心组件看起来是什么.展示专门通过 props 接受数据和回调,并且几乎不会有自身的状态,但当展示组件拥有自身的状态时,通常也只关心 UI 状态而不是数据的状态.(子组件)容器组件则更关心组件 ...
- python模块------pyautogui
安装 pip install pyautogui 基本使用 查询 screenWidth, screenHeight = pyautogui.size() # 屏幕尺寸 mouseX, mouseY ...
- 汽车Lin总线特点
串行通信:线间干扰小,节省线束,传输距离长 单线传输:增强的ISO 9141 (ISO 15765-1),总线电压基于VBAT 最高速率:20kbit/s 单主多从结构,无需仲裁:主节点同时包含主任务 ...
- 浏览器端-W3School-JavaScript-HTML DOM:HTML DOM Element 对象
ylbtech-浏览器端-W3School-JavaScript-HTML DOM:HTML DOM Element 对象 1.返回顶部 1. HTML DOM Element 对象 HTML DOM ...
- 浏览器端-W3School-JavaScript:JavaScript 全局对象
ylbtech-浏览器端-W3School-JavaScript:JavaScript 全局对象 1.返回顶部 1. JavaScript 全局对象 全局属性和函数可用于所有内建的 JavaScrip ...
- 【flask】处理表单数据
表单数据的处理涉及很多内容,除去表单提交不说,从获取数据到保存数据大致会经历以下步骤: 解析请求,获取表单数据. 对数据进行必要的转换,比如将勾选框的植转换为Python的布尔值. 验证数据是否符合 ...
- delphi TDbGrid 右键 PopupMenu 菜单只在有数据的地方弹出
最近用delphi做开发,用到了DbGrid控件,想在控件上点击鼠标右键弹出菜单 关联DbGrid的 Popupmenu 倒是可以实现,但是这样的效果是不管你在哪里单击鼠标右键 只要在DBGrid里面 ...