1 条题解

  • 0
    @ 2025-11-19 11:43:08

    题目重述

    我们要求计算:

    [ 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. 核心函数 gcomb

    int 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. 多项式变换 trans

    void trans(int ccf, int deg) { ... }
    

    这个函数实现了多项式基的变换,将普通多项式系数转换为二项式系数表示。


    算法流程

    1. 预处理阶段

      • 初始化阶乘、逆元
      • 预处理 F0F1 数组(用于不同情况的卷积核)
      • 预处理部分和数组 pfs
    2. 处理每个询问

      • 读入 (n, m) 和多项式系数
      • 对多项式进行基变换(trans 函数)
      • 对每个单项式 (x^i y^j):
        • 调整 (n, m) 的偏移量
        • 调用 calc 计算该单项式的贡献
        • 累加到答案
    3. 输出所有询问的答案


    关键优化技巧

    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 高效计算。代码通过精妙的预处理和批量处理,在给定约束下实现了高效计算。

    • 1

    「2021 集训队互测」生活在对角线下

    信息

    ID
    5480
    时间
    1500ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者