【做题记录】集训队作业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\)。
但是这样精度问题就有点麻烦。要证明这玩意对于精度不会产生影响。反正我是不证了,能过。

浙公网安备 33010602011771号