1 条题解
-
0
自动搬运
来自洛谷,原作者为

NaCly_Fish
北海虽赊,扶摇可接。搬运于
2025-08-24 22:10:41,当前版本为作者最后更新于2019-06-19 21:56:24,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
update:修整了一下题解格式。
看看题目让我们求什么:
我们可以考虑求出 的倒数,然后再乘上 ,得出结果。
高精度实数运算实现起来并不复杂,每个数记一下乘了 的多少次方,做加减的时候移位一下就行。
做乘法会更简单,不用移位,把幂次加起来即可。关于怎么求 的倒数,可以考虑牛顿迭代:
这里只用到了乘法和减法,所以可以直接用 的乘法来算(这里设 的位数为 )。
一般把 的初值选为 左右的数,这样减小一些常数(一次迭代)。由于每次迭代精度翻一倍,所以时间复杂度为
由于 的位数最多不超过 ,故计算 的误差只要小于 , 的误差就小于 ,直接取整就得到了 。
别忘了还要对最后算出来的结果用【模板】多项式求逆 处理一下。
上述做法需要实现高精度实数运算,可能稍微有些麻烦。在 WC2012 的论文《理性愉悦:高精度数值计算》(原作者:倪泽堃)中有提到一种只用高精度整数的做法,这里复述一下:
设 有 位,那么我们希望求得 ,然后计算出 ,经调整后即得到 。
不过这里面有个 舍入的误差问题,为了保证最后调整的次数是 的,那么 相对 的位数不能太少。
假设 有 位,我们需要使得 。这样可以证明最后调整时,误差不超过。这很简单,假设 ,两者同时左移若干位即可。下面的问题就是求解 。设前一次迭代求解的是 (其中 为 的前 位组成的数),那么这一次的迭代式为:
$$b'^*/10^{2n}=2b_k'/10^{2k}/10^{n-k}-b(b_k'/10^{2k}/10^{n-k})^2 $$也就是:
$$b'^*=2b_k'\times10^{n-k}-bb_k'^2/10^{2k} \approx 2b_k'\times10^{n-k}-\lfloor bb_k'^2/10^{2k} \rfloor $$求得 当然还没完,这只是迭代的结果,不是 的精确值。
误差分析表明,当 时,误差不超过 ,于是还要在求得余数 后对 进行 次的调整(为了降低常数,还可以二分误差)。这样就迭代求出了
迭代边界为 ,此时 在小整数范围内,可以直接求解。求解出 后与 相乘,在计算出余数后和上面类似的调整,即可求解出。
时间复杂度分析同高精度实数做法。
- 1
信息
- ID
- 4412
- 时间
- 2000ms
- 内存
- 500MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者