2020牛客暑期多校訓練營(第五場)C Easy —— 生成函式,有丶東西
題意:
題解:
推薦題解:This way
大致方法就是將a和b的貢獻列出來,然後會得到一個n*m的貢獻矩陣,消掉之後會得到這樣一個東西:
(
1
−
x
)
∗
S
=
x
y
∗
G
(
y
)
∗
G
(
x
y
)
(1-x)*S=xy*G(y)*G(xy)
(1−x)∗S=xy∗G(y)∗G(xy)
然後再乘上
G
(
x
)
G(x)
G(x)
→
S
=
x
y
∗
G
(
x
)
∗
G
(
y
)
∗
G
(
x
y
)
\rightarrow S=xy*G(x)*G(y)*G(xy)
→S=xy∗G(x)∗G(y)∗G(x
那麼
S
k
=
x
k
y
k
∗
G
k
(
x
)
∗
G
k
(
y
)
∗
G
k
(
x
y
)
S^k=x^ky^k*G^k(x)*G^k(y)*G^k(xy)
Sk=xkyk∗Gk(x)∗Gk(y)∗Gk(xy)
那麼我們要求
x
n
y
m
x^ny^m
xnym也就相當於
x
k
y
k
∗
G
k
(
x
)
∗
G
k
(
y
)
∗
G
k
(
x
y
)
=
x
n
y
m
x^ky^k*G^k(x)*G^k(y)*G^k(xy)=x^ny^m
xkyk∗Gk(x)∗Gk(y)∗Gk(xy)=xnym
→
G
k
(
x
)
∗
G
k
(
y
)
∗
G
k
(
x
y
)
=
x
n
−
k
y
m
−
k
\rightarrow G^k(x)*G^k(y)*G^k(xy)=x^{n-k}y^{m-k}
我們知道
G
k
(
x
)
=
∑
i
=
0
C
k
+
i
−
1
i
−
1
x
i
G^k(x)=\sum\limits_{i=0}C_{k+i-1}^{i-1}x_i
Gk(x)=i=0∑Ck+i−1i−1xi
那麼我們列舉
G
(
x
y
)
G(xy)
G(xy)貢獻
i
i
i個
x
y
xy
xy,去求
G
k
(
x
)
∗
G
k
(
y
)
=
x
n
−
k
−
i
y
m
−
k
−
i
G^k(x)*G^k(y)=x^{n-k-i}y^{m-k-i}
Gk(x)∗Gk(y)=xn−k−iym−k−i即可
於是最終的式子為
∑
i
=
0
m
i
n
(
n
,
m
)
C
n
−
k
−
i
+
k
−
1
k
−
1
∗
C
m
−
k
−
i
+
k
−
1
k
−
1
∗
C
i
+
k
−
1
k
−
1
\sum\limits_{i=0}^{min(n,m)}C_{n-k-i+k-1}^{k-1}*C_{m-k-i+k-1}^{k-1}*C_{i+k-1}^{k-1}
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
#define ll long long
const ll mod=998244353;
ll fac[N],inv[N];
ll c(int n,int m){
if(m>n||m<0)return 0;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
ll qpow(ll a,ll b){ll ans=1;for(;b;b>>=1,a=a*a%mod)if(b&1)ans=ans*a%mod;return ans;}
int main()
{
fac[0]=inv[0]=1;
for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%mod;
inv[N-1]=qpow(fac[N-1],mod-2);
for(int i=N-2;i;i--)
inv[i]=inv[i+1]*(i+1)%mod;
int t;
scanf("%d",&t);
while(t--){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
ll ans=0;
for(int i=0;i<=min(n,m);i++)
ans=(ans+c(n-i-1,k-1)*c(m-i-1,k-1)%mod*c(i+k-1,k-1))%mod;
printf("%lld\n",ans);
}
return 0;
}