若序列 A A A、 B B B 满足 ∑ i = 1 K a i = N , ∑ i = 1 K b i = M \sum\limits_{i=1}^K a_i=N,\sum\limits_{i=1}^K b_i=M i=1∑Kai=N,i=1∑Kbi=M,则其对答案贡献为 P = ∏ i = 1 K min ( a i , b i ) P=\prod\limits_{i=1}^K\min(a_i,b_i) P=i=1∏Kmin(ai,bi),问所有满足条件的序列的总贡献是多少?
( 1 ≤ N , M ≤ 1 0 6 , 1 ≤ K ≤ min ( N , M ) ) (1\leq N,M\leq 10^6,1\leq K\leq \min(N,M)) (1≤N,M≤106,1≤K≤min(N,M))
题目链接: l i n k link link
参考题解: l i n k 1 link1 link1, l i n k 2 link2 link2
如果本题要求的是序列 A A A、 B B B 方案总数,那答案应该是 S = ( 1 + x 1 + x 2 + . . . + x n ) k ( 1 + y 1 + y 2 + . . . + y m ) k S=(1+x^1+x^2+...+x^n)^k(1+y^1+y^2+...+y^m)^k S=(1+x1+x2+...+xn)k(1+y1+y2+...+ym)k 展开式中 x n y m x^ny^m xnym 的系数,但本题因为要求 ∏ i = 1 K min ( a i , b i ) \prod\limits_{i=1}^K\min(a_i,b_i) i=1∏Kmin(ai,bi),因此构造母函数为 S = ∑ i , j ∈ [ 1 , ∞ ] min ( i , j ) x i y j S=\sum\limits_{i,j\in[1,\infty]}\min(i,j)x^iy^j S=i,j∈[1,∞]∑min(i,j)xiyj,因此最终答案为 S k S^k Sk 的 x n y m x^ny^m xnym 系数。
S = x y + x y 2 + x y 3 + . . . + x 2 y + 2 x 2 y 2 + 2 x 2 y 3 + . . . + x 3 y + 2 x 3 y 2 + 3 x 3 y 3 + . . . + . . . \begin{aligned} S=\ &xy+xy^2+xy^3+...+ \\ &x^2y+2x^2y^2+2x^2y^3+...+\\ &x^3y+2x^3y^2+3x^3y^3+...+\\ & ... \end{aligned} S= xy+xy2+xy3+...+x2y+2x2y2+2x2y3+...+x3y+2x3y2+3x3y3+...+...
x S = 0 + 0 + 0 + . . . + x 2 y + x 2 y 2 + x 2 y 3 + . . . + x 3 y + 2 x 3 y 2 + 2 x 3 y 3 + . . . + . . . \begin{aligned} xS=\ & 0+0+0+...+\\ & x^2y+x^2y^2+x^2y^3+...+\\ & x^3y+2x^3y^2+2x^3y^3+...+\\ & ... \end{aligned} xS= 0+0+0+...+x2y+x2y2+x2y3+...+x3y+2x3y2+2x3y3+...+...
S − x S = x y + x y 2 + x y 3 + . . . + 0 + x 2 y 2 + x 2 y 3 + . . . + 0 + 0 + x 3 y 3 + . . . + . . . \begin{aligned} S-xS=\ &xy+xy^2+xy^3+...+ \\ &0+x^2y^2+x^2y^3+...+\\ &0+0+x^3y^3+...+\\ & ... \end{aligned} S−xS= xy+xy2+xy3+...+0+x2y2+x2y3+...+0+0+x3y3+...+...
令 f ( 1 ) = x y ( 1 + y + y 2 + . . . ) f(1)=xy(1+y+y^2+...) f(1)=xy(1+y+y2+...), f ( n ) = x y f ( n − 1 ) f(n)=xyf(n-1) f(n)=xyf(n−1),则 S − x S = ∑ i = 1 ∞ f ( i ) = f ( 1 ) ( 1 + x y + x 2 y 2 + . . . ) = x y ( 1 + y + y 2 + . . . ) ( 1 + x y + x 2 y 2 + . . . ) S-xS=\sum\limits_{i=1}^{\infty} f(i)=f(1)(1+xy+x^2y^2+...)=xy(1+y+y^2+...)(1+xy+x^2y^2+...) S−xS=i=1∑∞f(i)=f(1)(1+xy+x2y2+...)=xy(1+y+y2+...)(1+xy+x2y2+...)。令 G ( x ) = 1 + x + x 2 + x 3 + . . . G(x)=1+x+x^2+x^3+... G(x)=1+x+x2+x3+...,则 S ( 1 − x ) = x y ∗ G ( y ) ∗ G ( x y ) S(1-x)=xy*G(y)*G(xy) S(1−x)=xy∗G(y)∗G(xy)。
因为 G ( x ) = x ∗ G ( x ) + 1 G(x)=x*G(x)+1 G(x)=x∗G(x)+1,即 G ( x ) = 1 1 − x G(x)=\displaystyle\frac{1}{1-x} G(x)=1−x1,因此 S = x y ∗ G ( x ) ∗ G ( y ) ∗ G ( x y ) S=xy*G(x)*G(y)*G(xy) S=xy∗G(x)∗G(y)∗G(xy), S k = x k y k G k ( x ) G k ( y ) G k ( x y ) S^k=x^ky^kG^k(x)G^k(y)G^k(xy) Sk=xkykGk(x)Gk(y)Gk(xy),又因为 G k ( x ) = ∑ i = 0 ∞ C k + i − 1 k − 1 x i G^k(x)=\sum\limits_{i=0}^{\infty}C_{k+i-1}^{k-1}x^i Gk(x)=i=0∑∞Ck+i−1k−1xi( k k k 个盒子 i i i 个球,允许盒为空的方案数),因此我们可以枚举 G k ( x y ) G^k(xy) Gk(xy) 中 x i y i x^iy^i xiyi 的贡献,即最终答案为 r e s = ∑ i = 0 min ( n , m ) − k C k + ( n − k − i ) − 1 k − 1 C k + ( m − k − i ) − 1 k − 1 C k + i − 1 k − 1 res=\sum\limits_{i=0}^{\min(n,m)-k}C_{k+(n-k-i)-1}^{k-1}C_{k+(m-k-i)-1}^{k-1}C_{k+i-1}^{k-1} res=i=0∑min(n,m)−kCk+(n−k−i)−1k−1Ck+(m−k−i)−1k−1Ck+i−1k−1。
此题的难度很大,从母函数的构造一直到化简求解,始终具有很大的难度。目前此类母函数构造题还处于非常低的水平,还需要继续加强题目练习!
#include
#define rep(i,a,b) for(int i = a; i <= b; i++)
typedef long long ll;
const ll mod = 998244353;
const int N = 2e6+10;
using namespace std;
ll n,m,k,base[N],inv[N];
void init() {
base[k-1] = 1;
rep(i,k,max(n,m)) {
base[i] = base[i-1] * (ll)i % mod * inv[i-k+1] % mod;
}
}
void solve() {
ll ans = 0;
rep(i,0,min(n,m)-k) {
ll t = base[k+i-1];
t = t * base[m-i-1] % mod;
t = t * base[n-i-1] % mod;
ans = (ans + t) % mod;
}
printf("%lld\n",ans);
}
int main()
{
inv[1] = 1;
rep(i,2,1e6+10) {
inv[i] = (ll)(mod-mod/i)*inv[mod%i]%mod;
}
int _; scanf("%d",&_);
while(_--) {
scanf("%lld%lld%lld",&n,&m,&k);
init();
solve();
}
return 0;
}