AT_arc212_c [ARC212C] ABS Ball

AT_arc212_c [ARC212C] ABS Ball

纪念一下第一次赛时用生成函数过题。

题意:有 \(n\) 个不区分的球和 \(m\) 个区分的箱子,先将所有球染成红色或蓝色再放到箱子里(允许空箱),设 \(a_i,b_i\) 分别为第 \(i\) 个箱子中红球和蓝球的数目,求所有方案的 $\prod_{i=1}^m |a_i-b_i| $ 之和。
数据范围:\(n,m\le 10^7\)

官解貌似是对组合意义进行分析,注意到我不会组合意义,所以采用生成函数。

\(k\) 个球放到一个盒子里的总贡献为 \(f_k\),则有:

\[f_k=\sum_{i=0}^k |i-(k-i)|=\sum_{i=0}^k |2i-k| \]

\(k\) 为偶数时:

\[f_k=\sum_{i=0}^k |2i-k|=2\sum_{i=1}^{\frac{k}{2}}2i=\frac{k^2+2k}{2} \]

\(k\) 为奇数时:

\[f_k=\sum_{i=0}^k |2i-k|=2\sum_{i=1}^{\frac{k+1}{2}}(2i-1)=\frac{k^2+2k+1}{2} \]

将两式综合起来可得:

\[f_k=\frac{k^2+2k+1-[k \bmod 2=0]}{2} \]

这个 \(\frac{1}{2}\) 对每个箱子都有,那么我们不妨把它去掉,并在最后把答案乘上 \(\frac{1}{2^m}\),于是我们有:

\[g_k=k^2+2k+1-[k \bmod 2=0] \]

\(g\) 的生成函数为 \(F\),则我们要求的就是 \(\frac{1}{2^m}[x^n]F^m\),使用多项式快速幂可以做到 \(O(n\log n)\),然而无法通过本题,那么我们先推导一下 \(F\)

先处理 \(\sum_{i=0}^{\infty}(i^2+2i+1)x^i\),为此考虑对 \(\frac{1}{1-x}\) 求导。

\[\begin{aligned} \frac{1}{1-x}&=\sum_{i=0}^{\infty}{x^i} \\ (\frac{1}{1-x})'=\frac{1}{(1-x)^2}&=\sum_{i=0}^{\infty}(i+1)x^i \\ (\frac{1}{1-x})''=\frac{2}{(1-x)^3}&=\sum_{i=0}^{\infty}(i^2+3i+2)x^i \end{aligned} \\ \sum_{i=0}^{\infty}(i^2+2i+1)x^i=\sum_{i=0}^{\infty}(i^2+3i+2)x^i-\sum_{i=0}^{\infty}(i+1)x^i=\frac{2}{(1-x)^3}-\frac{1}{(1-x)^2} \]

再考虑 \(\sum_{i=0}^{\infty}[i \bmod 2=0]x^i\)

\[\begin{aligned} \sum_{i=0}^{\infty}{x^i}&=\frac{1}{1-x} \\ \sum_{i=0}^{\infty}[i \bmod 2=0]x^i=\sum_{i=0}^{\infty}{x^{2i}}&=\frac{1}{1-x^2} \\ \end{aligned} \\ \]

所以:

\[\begin{aligned} F&=\sum_{i=0}^{\infty}(i^2+2i+1-[i \bmod 2=0])x^i \\ &=\frac{2}{(1-x)^3}-\frac{1}{(1-x)^2}-\frac{1}{1-x^2} \\ &=\frac{1}{1-x}(\frac{2}{(1-x)^2}-\frac{1}{1-x}-\frac{1}{1+x}) \\ &=\frac{1}{1-x}(\frac{2}{(1-x)^2}-\frac{2}{1-x^2}) \\ &=\frac{2}{(1-x)^2}(\frac{1}{1-x}-\frac{1}{1+x}) \\ &=\frac{4x}{(1-x)^2(1-x^2)} \end{aligned} \]

再代入原式。

\[\begin{aligned} \frac{1}{2^m}[x^n]F^m&=\frac{1}{2^m}[x^n](\frac{4x}{(1-x)^2(1-x^2)})^m \\ &=\frac{1}{2^m}[x^n]4^mx^m\frac{1}{(1-x)^{2m}}\frac{1}{(1-x^2)^m} \\ &=2^m[x^n]x^m\frac{1}{(1-x)^{2m}}\frac{1}{(1-x^2)^m} \end{aligned} \]

\(m>n\) 时答案为 \(0\),否则结果为:

\[\begin{aligned} &2^m[x^n]x^m\frac{1}{(1-x)^{2m}}\frac{1}{(1-x^2)^m} \\ =&2^m[x^{n-m}]\frac{1}{(1-x)^{2m}}\frac{1}{(1-x^2)^m} \\ =&2^m[x^{n-m}](\sum_{i=0}^{\infty}\binom{i+2m-1}{i}x^i)(\sum_{i=0}^{\infty}\binom{i+m-1}{i}x^{2i}) \\ =&2^m\sum_{i=0}^{n-m} [i \bmod 2=0]\binom{\frac{i}{2}+m-1}{\frac{i}{2}}\binom{n-i+m-1}{n-m-i} \end{aligned} \]

预处理阶乘及逆元后可以 \(O(n)\) 求出。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int M = 2.05e7 , mod = 998244353;
int qpow(int x , int y){
	int res = 1;
	while(y){
		if(y & 1) res = res * x % mod;
		x = x * x % mod , y >>= 1;
	}
	return res;
}
int n , m , jc[M] , jc_[M] , ans;

int C(int x , int y){ return jc[x] * jc_[y] % mod * jc_[x - y] % mod; }
signed main(){
	jc[0] = jc_[0] = 1;
	for(int i = 1; i < M; ++i) jc[i] = jc[i - 1] * i % mod;
	jc_[M - 1] = qpow(jc[M - 1] , mod - 2);
	for(int i = M - 1; i; --i) jc_[i - 1] = jc_[i] * i % mod;

	cin>>n>>m;
	if(n < m){ cout<<"0\n"; return 0; }
	for(int i = 0; i <= n - m; i += 2) (ans += C(n - i + m - 1 , n - m - i) * C(i / 2 + m - 1 , i / 2)) %= mod;
	cout<<(ans * qpow(2 , m) % mod)<<'\n';

	return 0;
}

posted @ 2026-01-12 19:42  bjt123  阅读(9)  评论(1)    收藏  举报