【做题记录】集训队作业2020 Old Problem

  • 集训队作业 \(\text{2020 Old Problem}\)

    • 误差分析

题目:

给一个长度为 \(n\) 的序列 \(a_i\),和 \(q\) 组询问 \((l,r,x)\),表示求 \(\displaystyle\prod_{i=l}^r\left(1-\frac{a_i}{x}\right)\) 的值。精度 \(10^{-6}\)

\(n,q\le6\times10^5,\ 1\leq a_i < x\leq 10^9\)


题解:

注意到

\[\begin{aligned} &\exp\left(\ln\left(\prod_{i=l}^r\left(1-\frac{a_i}{x}\right)\right)\right) \\ =&\exp\left(\sum_{i=l}^r\ln\left(1-\frac{a_i}{x}\right)\right) \\ =&\exp\left(-\sum_{i=l}^r\sum_{k=1}^{m}\frac{a_i^k}{k\times x^k}\right) \\ \end{aligned}\]

然后显然不能直接泰勒展开。

考虑使泰勒展开精度损失的原因。当 \(\dfrac{a_i}x\) 较大时,\(\ln(1-\dfrac{a_i}x)\) 的精度要求很高,导致答案小于精度范围。

所以容易想到考虑设个阈值 \(ips\)。表示对于 \(\dfrac{a_i}x\) 的大小情况的判断。当 \(\dfrac{a_i}x\) 小于阈值时,直接用线段树维护泰勒展开。否则就暴力计算,然后判断精度问题。

\(ips\) 差不多 \(\dfrac{1}2\)

暴力显然不会超过 \(\log N\) 次。

然后时间复杂度就是 \(O(n\log^2m)\)\(m\) 大约 \(20\) 几这个样子。

然后就做完了。

当然可以前缀和优化线段树少个 \(\log\)

但是这样精度问题就有点麻烦。要证明这玩意对于精度不会产生影响。反正我是不证了,能过。

posted @ 2022-01-17 18:35  trsins  阅读(107)  评论(0)    收藏  举报