【Nowcoder - 5670 C Easy】2020牛客暑期多校训练营(第五场)【生成函数、组合数学】

题意

若序列 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=1Kai=N,i=1Kbi=M,则其对答案贡献为 P = ∏ i = 1 K min ⁡ ( a i , b i ) P=\prod\limits_{i=1}^K\min(a_i,b_i) P=i=1Kmin(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)) (1N,M106,1Kmin(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=1Kmin(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} SxS= 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(n1),则 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+...) SxS=i=1f(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(1x)=xyG(y)G(xy)

因为 G ( x ) = x ∗ G ( x ) + 1 G(x)=x*G(x)+1 G(x)=xG(x)+1,即 G ( x ) = 1 1 − x G(x)=\displaystyle\frac{1}{1-x} G(x)=1x1,因此 S = x y ∗ G ( x ) ∗ G ( y ) ∗ G ( x y ) S=xy*G(x)*G(y)*G(xy) S=xyG(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=0Ck+i1k1xi 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=0min(n,m)kCk+(nki)1k1Ck+(mki)1k1Ck+i1k1


总结

此题的难度很大,从母函数的构造一直到化简求解,始终具有很大的难度。目前此类母函数构造题还处于非常低的水平,还需要继续加强题目练习!


代码

#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;
}

你可能感兴趣的:(#,组合数学,数论,2020牛客第五场,生成函数,母函数,组合数学)