1 条题解
-
0
题目重述
我们要求计算:
[ S(n,m) = \sum_{x=0}^n \sum_{y=0}^{\min(x,m)} \binom{x+y}{x} \binom{n-x+m-y}{n-x} F(x,y) ]
其中 (F(x,y)) 是一个给定的 (p \times q) 次二元多项式,且所有询问满足 (m-n = c)(常数)。
核心思路
这个问题是组合卷积形式,难点在于双重求和以及 (F(x,y)) 的多项式形式。
第一步:多项式分解
由于 (F(x,y)) 次数不高(((p+1)(q+1) \le 10)),我们可以将其拆成单项式求和:
[ F(x,y) = \sum_{i=0}^p \sum_{j=0}^q f_{ij} x^i y^j ]
于是原式变成:
[ S(n,m) = \sum_{i=0}^p \sum_{j=0}^q f_{ij} \sum_{x=0}^n \sum_{y=0}^{\min(x,m)} \binom{x+y}{x} \binom{n-x+m-y}{n-x} x^i y^j ]
第二步:利用多项式变换
代码中的关键技巧是:将 (x^i) 和 (y^j) 用二项式系数表示。
利用恒等式: [ x^i = \sum_{a} c_{ia} \binom{x}{a} ] 类似地处理 (y^j)。
这样可以将问题转化为:
[ S(n,m) = \sum_{i,j} f_{ij} \sum_{a=0}^i \sum_{b=0}^j c_{ia} d_{jb} \sum_{x=0}^n \sum_{y=0}^{\min(x,m)} \binom{x+y}{x} \binom{n-x+m-y}{n-x} \binom{x}{a} \binom{y}{b} ]
第三步:组合恒等式
核心的卷积恒等式是:
[ \sum_{x,y} \binom{x+y}{x} \binom{n-x+m-y}{n-x} \binom{x}{a} \binom{y}{b} = \binom{n+m+1}{n-a-b} \quad\text{?} ]
实际上更复杂,但代码利用了生成函数+FFT的方法来批量计算这些和。
代码结构分析
1. 预处理阶乘和组合数
int fac[300005], ifac[300005]; void init_fac() { ... } int comb(int x, int y) { ... }预处理阶乘和逆元,用于快速计算组合数。
2. FFT 实现
void dft(int arr[], int siz, bool rev) { ... }用于多项式乘法。
3. 核心函数
gcombint gcomb(int n0, int nd) { return nd == 0 ? (n0 == 0) : (comb(n0 + nd - 1, n0) - comb(n0 + nd, n0 - 1) + MOD) % MOD; }这个函数计算某种组合数差值,与路径计数有关。
4. 主计算函数
calc根据 (d = m-n) 的正负分两种情况,利用 FFT 计算卷积:
- 当 (d > 0) 时,使用
F0数组进行卷积 - 当 (d \le 0) 时,使用
F1数组进行卷积
5. 多项式变换
transvoid trans(int ccf, int deg) { ... }这个函数实现了多项式基的变换,将普通多项式系数转换为二项式系数表示。
算法流程
-
预处理阶段:
- 初始化阶乘、逆元
- 预处理
F0和F1数组(用于不同情况的卷积核) - 预处理部分和数组
pfs
-
处理每个询问:
- 读入 (n, m) 和多项式系数
- 对多项式进行基变换(
trans函数) - 对每个单项式 (x^i y^j):
- 调整 (n, m) 的偏移量
- 调用
calc计算该单项式的贡献 - 累加到答案
-
输出所有询问的答案
关键优化技巧
1. 利用常数差 (c)
由于所有询问中 (m-n=c) 是常数,可以预先计算与 (c) 相关的卷积核。
2. FFT 加速卷积
使用 FFT 在 (O(N \log N)) 时间内计算大量组合数的卷积。
3. 多项式基变换
将 (x^i) 用 (\binom{x}{a}) 的线性组合表示,从而将问题转化为更易处理的形式。
4. 批量处理
对所有询问同时计算,利用向量化思想。
复杂度分析
- 预处理:(O(N \log N + (p+q)^2 \cdot N))
- 每个询问:(O((p+1)(q+1) \cdot \text{多项式操作成本}))
- 总复杂度:在给定约束下可行
总结
这道题是一个组合卷积问题,解法结合了:
- 多项式变换
- 生成函数
- FFT 加速
- 组合恒等式
核心思想是将复杂的双重求和转化为多项式乘法,利用 FFT 高效计算。代码通过精妙的预处理和批量处理,在给定约束下实现了高效计算。
- 当 (d > 0) 时,使用
- 1
信息
- ID
- 5480
- 时间
- 1500ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者