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

题面

洛谷

题解

对于每一组询问,要求的东西本质上就是:

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

如果没有后面那个部分,就是一个范德蒙恒等式,所以就要把这个\(i^L\)直接拆掉。

然后直接拿第二类斯特林数来拆:

\[i^L=\sum_{j=0}^L\begin{Bmatrix}L\\j\end{Bmatrix}{i\choose j}j!
\]

于是就把答案拆成了:

\[\begin{aligned}
Ans&=\sum_{i=0}^k{m\choose i}{n-m\choose k-i}i^L\\
&=\sum_{i=0}^{k}{m\choose i}{n-m\choose k-i}\sum_{j=0}^L\begin{Bmatrix}L\\j\end{Bmatrix}{i\choose j}j!\\
&=\sum_{j=0}^L\begin{Bmatrix}L\\j\end{Bmatrix}j!\sum_{i=0}^{k}{m\choose i}{n-m\choose k-i}{i\choose j}
\end{aligned}\]

然后发现\(\displaystyle {m\choose i}{i\choose j}={m\choose j}{m-j\choose i-j}\)

然后就有:

\[\begin{aligned}
Ans&=\sum_{j=0}^L\begin{Bmatrix}L\\j\end{Bmatrix}j!{m\choose j}\sum_{i=0}^{k}{n-m\choose k-i}{m-j\choose i-j}\\
&=\sum_{j=0}^L\begin{Bmatrix}L\\j\end{Bmatrix}j!{m\choose j}{n-j\choose k-j}\\
\end{aligned}\]

这样子可以做到单次\(O(L)\)。

于是预处理第二类斯特林数就行了。

这题不知道为什么要卡常,不太理解卡常的意义合在......

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MOD 998244353
#define MAX 524288
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
int W[MAX],r[MAX];
void NTT(int *P,int opt,int len)
{
int l=0,N;for(N=1;N<len;N<<=1)++l;
for(int i=0;i<N;++i)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
for(int i=0;i<N;++i)if(i<r[i])swap(P[i],P[r[i]]);
for(int i=1;i<N;i<<=1)
{
int w=fpow(3,(MOD-1)/(i<<1));W[0]=1;
for(int k=1;k<i;++k)W[k]=1ll*W[k-1]*w%MOD;
for(int j=0,p=i<<1;j<N;j+=p)
for(int k=0;k<i;++k)
{
int X=P[j+k],Y=1ll*W[k]*P[i+j+k]%MOD;
P[j+k]=(X+Y)%MOD;P[i+j+k]=(X+MOD-Y)%MOD;
}
}
if(opt==-1)
{
reverse(&P[1],&P[N]);
for(int i=0,inv=fpow(N,MOD-2);i<N;++i)P[i]=1ll*P[i]*inv%MOD;
}
}
int n,m,T,L;
int A[MAX],B[MAX],S[MAX];
int jc[20000010],jv[20000010];
int C(int n,int m){if(n<m||n<0||m<0)return 0;return 1ll*jc[n]*jv[m]%MOD*jv[n-m]%MOD;}
int main()
{
n=read();m=read();T=read();L=read();
jc[0]=jv[0]=jv[1]=1;int mx=max(L,n);
for(int i=1;i<=mx;++i)jc[i]=1ll*jc[i-1]*i%MOD;jv[mx]=fpow(jc[mx],MOD-2);
for(int i=mx-1;i;--i)jv[i]=1ll*jv[i+1]*(i+1)%MOD;
for(int i=0,d=1;i<=L;++i,d=MOD-d)A[i]=1ll*d*jv[i]%MOD;
for(int i=0;i<=L;++i)B[i]=1ll*fpow(i,L)*jv[i]%MOD;
int N;for(N=1;N<=L+L;N<<=1);
NTT(A,1,N);NTT(B,1,N);
for(int i=0;i<N;++i)S[i]=1ll*A[i]*B[i]%MOD;
NTT(S,-1,N);
while(T--)
{
int N=read(),M=read(),K=read(),ans=0,Lim=min(L,min(M,min(N,K)));;
for(int i=0;i<=Lim;++i)ans=(ans+1ll*S[i]*jv[M-i]%MOD*jc[N-i]%MOD*jv[K-i])%MOD;
ans=1ll*ans*jc[M]%MOD*jv[N]%MOD*jc[K]%MOD;
printf("%d\n",ans);
}
return 0;
}

【洛谷2791】幼儿园篮球题(第二类斯特林数,NTT)的更多相关文章

  1. 【洛谷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 ...

  2. 洛谷 P2791 幼儿园篮球题

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

  3. BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT

    定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...

  4. BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】

    题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...

  5. BZOJ4555 [Tjoi2016&Heoi2016]求和 【第二类斯特林数 + NTT】

    题目 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + ...

  6. bzoj 5093 图的价值 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 每个点都是等价的,从点的贡献来看,得到式子: \( ans = n * \sum\li ...

  7. bzoj 4555 [Tjoi2016&Heoi2016] 求和 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 关于第二类斯特林数:https://www.cnblogs.com/Wuweizhen ...

  8. 【BZOJ4555】【TJOI2016】【HEOI2016】求和 (第二类斯特林数+NTT卷积)

    Description 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: $$f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\tim ...

  9. bzoj5093:图的价值(第二类斯特林数+NTT)

    传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...

  10. P4091 [HEOI2016/TJOI2016]求和(第二类斯特林数+NTT)

    传送门 首先,因为在\(j>i\)的时候有\(S(i,j)=0\),所以原式可以写成\[Ans=\sum_{i=0}^n\sum_{j=0}^nS(i,j)\times 2^j\times j! ...

随机推荐

  1. 十ITK读取一张dcm图像然后通过vtk显示

    一.功能 通过ITK读取一张图片(dcm格式),然后通过vtk显示出来. 版本:VS2019 itk5.0.1 vtk 8.2.0 二.程序主要思路 1-读取dcm格式图片 2-转换为vtk可以读取的 ...

  2. [C]表达式结合规律和运算符优先级

    表达式结合规律 如果运算符具有相同的优先级(precedence)有些表达式的结合方式是从左往右,有些则是从右往左结合的(例如赋值运算符): 表达式 结合律 组合方式 a/b%c 从左往右 (a/b) ...

  3. Java之多线程创建方式

    多线程的由来 我们在之前,学习的程序在没有跳转语句的前提下,都是由上至下依次执行,那现在想要设计一个程序,边打游戏边听歌,怎么设计?要解决上述问题,咱们得使用多进程或者多线程来解决. 多线程的好处: ...

  4. SQL Server 索引分析开关

    set statistics io onset statistics profile on

  5. [译]Vulkan教程(30)深度缓存

    [译]Vulkan教程(30)深度缓存 Depth buffering 深度缓存 Introduction 入门 The geometry we've worked with so far is pr ...

  6. C++笔记——快读快写

    直接开始吧 额m~,这里就没什么好说的了,无非就是用getchar加快cin或printf的读入速度. 代码: inline int read() { int X=0; bool flag = 1; ...

  7. 用深度学习做命名实体识别(二):文本标注工具brat

    本篇文章,将带你一步步的安装文本标注工具brat. brat是一个文本标注工具,可以标注实体,事件.关系.属性等,只支持在linux下安装,其使用需要webserver,官方给出的教程使用的是Apac ...

  8. fiddler抓包syntaxview窗口乱码

    只需再fiddler界面GO往右第二个Decode点击一下,让他出现蓝色边框即可 注意:抓取前的他不会进行自动解码,要再重新刷新页面才能获取界面后的内容

  9. PHP fnmatch 文件系统函数

    定义和用法 fnmatch - 用模式匹配文件名 目前该函数无法在 Windows 或其它非 POSIX 兼容的系统上使用. 版本支持 PHP4 PHP5 PHP7 4.3.0(含)+支持 支持 支持 ...

  10. .netcore 文件上传转为base64位字符串

    .netcore文件上传Api接口,和正常的webForm提交类似,只是用postman测试接口时,记得给form表单命名,否则获取上传文件数量一直为0 后端代码 using System; usin ...