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

浙公网安备 33010602011771号