复制Markdown 展开
题目背景
众所周知,全民制作幼儿园园龄两年半的蔡徐坤同学喜欢唱、跳、rap 和篮球。而作为欧文的老师,他的篮球技术自然比 ikun 们要强得多。
题目描述
全民制作幼儿园的蔡徐坤专属篮球场上总共有 NN 个蔡徐坤专属篮球,而其中有 MM 个是没气的。鉴于蔡徐坤的高超技术,他投没气的球一定能进,而投有气的球一定不能。
蔡徐坤举办了 SS 场巡回篮球表演,第 ii 场表演 ikun 们会指定投球个数 k_iki ,ikun 们会从 NN 个蔡徐坤专属篮球中准备 n_ini 个球放在场地上,其中恰好有 m_imi 个是没气的。蔡徐坤会在这 n_ini 个蔡徐坤专属篮球中随机选出 k_iki 个投篮。如果投进了 xx 个,则这次表演的失败度为 x^LxL。ikun 们想知道这 SS 场表演的期望失败度对 998244353998244353 取模的结果。篮球表演之间相互独立。
输入格式
第一行,四个正整数,N,M,S,LN,M,S,L,表示蔡徐坤专属篮球总个数,没气的篮球总个数,蔡徐坤巡回篮球表演场数,以及失败度参数。
接下来的第 i+1i+1 行,每行三个正整数 n_i,m_i,k_ini,mi,ki,表示第 ii 场表演蔡徐坤专属篮球个数、没气的篮球个数和 ikun 们指定的投球个数。
输出格式
输出共 SS 行,第 ii 行为一个正整数,表示第 ii 场表演的期望失败度对 998244353998244353 取模的结果。
输入输出样例
输入 #1复制
3 2 1 3 3 2 2
输出 #1复制
332748121
说明/提示
对于样例,我们作出如下解释:设失败度为 XX,蔡徐坤有 \frac{1}{3}31 的概率投进 22 个,有 \frac{2}{3}32 的概率投进 11 个,期望失败度为 E(x)=\frac{2^3}{3}+\frac{1^3*2}{3}=\frac{10}{3}E(x)=323+313∗2=310,\frac{10}{3}\equiv 332748121\pmod{998244353}310≡332748121(mod998244353)。
子任务 1 (15\%15%):1\leq L\leq21≤L≤2。
子任务 2 (10\%10%):1\leq N\leq10^51≤N≤105。
子任务 3 (75\%75%):无特殊限制。
对于全部数据,1\leq S\leq2001≤S≤200,1\leq L\leq2\times 10^51≤L≤2×105,1\leq M\leq N\leq2\times 10^71≤M≤N≤2×107。并且对于 1\leq i\leq S1≤i≤S,有 1\leq m_i,k_i\leq n_i\leq N1≤mi,ki≤ni≤N,1\leq m_i\leq M1≤mi≤M。
题解
可以列出式子
∑ i = 0 k ( i m ) ( k − i n − m ) i L ( k n ) \frac{\sum_{i=0}^k(_i^m)(_{k-i}^{n-m})i^L}{(_k^n)}
(
k
n
)
∑
i=0
k
(
i
m
)(
k−i
n−m
)i
L
我们只关心上面那部分,套路把 i L i^Li
L
换掉,得
∑ i = 0 k ( i m ) ( k − i n − m ) ∑ j = 0 L { j L } ( j i ) j ! \sum_{i=0}^k(_i^m)(_{k-i}^{n-m})\sum_{j=0}^L\{_j^L\}(_j^i)j!
i=0
∑
k
(
i
m
)(
k−i
n−m
)
j=0
∑
L
{
j
L
}(
j
i
)j!
把 j jj 提前,得
∑ j = 0 L { j L } j ! ∑ i = 0 k ( i m ) ( k − i n − m ) ( j i ) \sum_{j=0}^L\{_j^L\}j!\sum_{i=0}^k(_i^m)(_{k-i}^{n-m})(_j^i)
j=0
∑
L
{
j
L
}j!
i=0
∑
k
(
i
m
)(
k−i
n−m
)(
j
i
)
由于 ( i m ) ( j i ) = ( j m ) ( i − j m − j ) (_i^m)(_j^i)=(_j^m)(_{i-j}^{m-j})(
i
m
)(
j
i
)=(
j
m
)(
i−j
m−j
) ,于是我们接着化
∑ j = 0 L { j L } j ! ( j m ) ∑ i = 0 k ( i − j m − j ) ( k − i n − m ) \sum_{j=0}^L\{_j^L\}j!(_j^m)\sum_{i=0}^k(_{i-j}^{m-j})(_{k-i}^{n-m})
j=0
∑
L
{
j
L
}j!(
j
m
)
i=0
∑
k
(
i−j
m−j
)(
k−i
n−m
)
我们观察到后面的式子,考虑其意义,就是在 m − j m-jm−j 个中选 i − j i-ji−j 个数乘上在 n − m n-mn−m 个数中选出 k − i k-ik−i 个数的总方案数,由于 i ii 是从 0 00 到 k kk ,所以可以看成是在 n − j n-jn−j 个数中选出 k − j k-jk−j 个数,于是我们得到式子
∑ j = 0 L { j L } j ! ( j m ) ( k − j n − j ) \sum_{j=0}^L\{_j^L\}j!(_j^m)(_{k-j}^{n-j})
j=0
∑
L
{
j
L
}j!(
j
m
)(
k−j
n−j
)
于是我们可以预处理 { j L } \{_j^L\}{
j
L
} 即可
代码
#include <bits/stdc++.h>
using namespace std;
const int N=8e5+5,M=2e7+5,P=998244353;
int n,m,T,L,G[2]={3,(P+1)/3},A[N],B[N],jc[M],ny[M],t=1,p,r[N];
int X(int x){return x>=P?x-P:x;}
int K(int x,int y){
int z=1;
for (;y;y>>=1,x=1ll*x*x%P)
if (y&1) z=1ll*z*x%P;
return z;
}
void Ntt(int *g,bool o){
for (int i=0;i<t;i++)
if (i<r[i]) swap(g[i],g[r[i]]);
for (int wn,i=1;i<t;i<<=1){
wn=K(G[o],(P-1)/(i<<1));
for (int x,y,j=0;j<t;j+=(i<<1))
for (int w=1,k=0;k<i;k++,w=1ll*w*wn%P)
x=g[j+k],y=1ll*w*g[i+j+k]%P,
g[j+k]=X(x+y),g[i+j+k]=X(x-y+P);
}
if (o)
for (int i=0,v=K(t,P-2);i<t;i++)
g[i]=1ll*v*g[i]%P;
};
int main(){
cin>>n>>m>>T>>L;
n=max(n,L);jc[0]=1;
for (int i=1;i<=n;i++)
jc[i]=1ll*i*jc[i-1]%P;
ny[n]=K(jc[n],P-2);
for (int i=n;i;i--)
ny[i-1]=1ll*i*ny[i]%P;
for (int i=0,F=1;i<=L;i++,F=P-F)
A[i]=1ll*F*ny[i]%P,
B[i]=1ll*K(i,L)*ny[i]%P;
for (;t<L+L+2;t<<=1,p++);
for (int i=0;i<t;i++)
r[i]=(r[i>>1]>>1)|((i&1)<<(p-1));
Ntt(A,0);Ntt(B,0);
for (int i=0;i<t;i++)
A[i]=1ll*A[i]*B[i]%P;
Ntt(A,1);
for (int x,k,v;T--;){
scanf("%d%d%d",&n,&m,&k);
v=min(min(n,m),min(k,L));x=0;
for (int i=0;i<=v;i++)
x=X(x+1ll*A[i]*ny[m-i]%P*jc[n-i]%P*ny[k-i]%P);
x=1ll*x*jc[m]%P*ny[n]%P*jc[k]%P;
printf("%d\n",x);
}
return 0;
}