test
是的,可以低于 \(O(n^2)\) 复杂度计算出对于每一个 \(k\) 的 \(\sum_i f(i,k) = \sum_i w_i \binom{n-1-i}{k}\)(其中 \(k\) 的范围是 \(0\) 到 \(n-1\),且 \(k\) 是 \(O(n)\) 量级)。具体来说,可以通过生成函数和快速傅里叶变换(FFT)在 \(O(n \log n)\) 时间内完成计算。以下是详细的算法步骤和复杂度分析。
算法步骤:
- 预处理:
给定 \(n\) 和权重 \(w_x\)(\(x\) 的范围是 \(1\) 到 \(n-1\))。
令 \(m = n - 2\)(因为 \(y = n - 1 - x\) 的范围是 \(0\) 到 \(n-2\))。
计算序列 \(v_y\)(\(y = 0\) 到 \(m\)):
即:
-
计算阶乘:
预计算阶乘 \(j!\) 和其倒数 \(\frac{1}{j!}\)(\(j = 0\) 到 \(m\)),复杂度 \(O(n)\)。 -
构建序列 \(A\) 和 \(C\):
序列 \(A\):长度为 \(m+1\),索引 \(j = 0\) 到 \(m\):
序列 \(C\):长度为 \(m+1\),索引 \(i = 0\) 到 \(m\):
-
计算卷积:
使用快速傅里叶变换(FFT)计算序列 \(A\) 和 \(C\) 的卷积 \(D = A * C\)。
卷积结果 \(D_l\) 的长度为 \(2m + 1\),索引 \(l = 0\) 到 \(2m\)。
FFT 的复杂度为 \(O(n \log n)\)(因为序列长度为 \(O(n)\))。 -
计算 \(g_k\) 和 \(s(k)\):
对于每个 \(k = 0\) 到 \(m\):
这里 \(s(k)\) 即为所求的 \(\sum_i w_i \binom{n-1-i}{k}\)。
对于 \(k > m\)(即 \(k > n-2\)),有 \(s(k) = 0\)(因为二项式系数 \(\binom{y}{k} = 0\) 当 \(y \leq n-2 < k\))。
- 输出:
输出 \(s(k)\) 对于 \(k = 0\) 到 \(n-1\)(对于 \(k > n-2\),直接输出 0)。
复杂度分析:
时间复杂度:
计算 \(v_y\):\(O(n)\)。
预计算阶乘:\(O(n)\)。
构建序列 \(A\) 和 \(C\):\(O(n)\)。
FFT 卷积:\(O(n \log n)\)(主导步骤)。
计算 \(g_k\) 和 \(s(k)\):\(O(n)\)(每个 \(k\) 的除法为 \(O(1)\),假设算术运算为常数时间)。
总体复杂度为 \(O(n \log n)\),低于 \(O(n^2)\)。
空间复杂度:\(O(n)\)(存储序列和卷积结果)。
正确性说明:
该算法基于生成函数 \(\sum_k s(k) z^k = \sum_y v_y (1 + z)^y\)。
通过变量替换和卷积(使用 FFT 加速),高效地提取系数 \(s(k)\)。
在 \(s(k)\) 的计算中,\(g_k = k! \cdot s(k)\),因此除以 \(k!\) 后得到正确结果。
小规模测试(如 \(n=3,4\))验证了算法的正确性。
注意事项:
数值精度:如果权重 \(w_x\) 是整数,则 \(s(k)\) 为整数。算法中涉及分数(如 \(C_i = 1/(m-i)!\)),但最终 \(s(k)\) 为精确值。在实际实现中,可使用浮点数 FFT(注意精度问题)或整数 FFT(如数论变换 NTT)结合缩放技术保证精确性。
生成函数的应用:算法利用了生成函数的性质 \(\sum_y v_y (1 + z)^y\) 和 FFT 实现高效卷积。
此方法在 \(O(n \log n)\) 时间内解决了问题,优于直接的 \(O(n^2)\) 方法。

浙公网安备 33010602011771号