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

WinXP
**搬运于
2025-08-24 21:38:43,当前版本为作者最后更新于2018-05-08 14:46:54,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
说真的 大佬的题解真的太意识流了(两篇) 对蒟蒻来说能坚持到看明白需要勇气啊。。对蒟蒻真的是不友善。。 或许怎么说。。。 这就是大佬吧。
首先公式给出,与那位大佬V2.0版中的公式相同。设 表示 最后一个非0的数,那么有
是预设的数组。
首先嘛 不要考虑 这么大的数。来考虑一些友善的数据范围,比如 这么大之类的。这个怎么做呢?
如果求某一个数 的最后一位那谁都会:。如果求的是某一个数 的最后一位非0的数,在 能算的出来的时候, 再 就好了。
注意这两点:。 等于 并且 都是质数。
那么现在把 表示为 。( 不包含质因子 和 ) 显然 。
(这里显然没问题吧)所以最后的结果应该为 。想到这里我们就可以用约为 级别的时间来计算这个解了。初始化 ,对于从 到 的每一个数,都除尽它的 因子与 因子,记下 的值,除干净了把这个数 并乘上 ,最后 乘一下 个 ,就能得到结果。
我们显然可以优化这个过程。
先把所有的 的倍数都拿出来放到一边,一会乘起来。原数组会变成类似
$$1,2,3,4,1,6,7,8,9,1,11,12,13,14,1,16,17,18,19,1,21,22 ... $$这样。
考虑像分块一样把每 个数作为一组。假想我们有一种方式,能将几个数相乘后的结果中的 预先抽离出来,将它变成
这个样子。
很显然如果不提 ,每一段乘起来 的值都是相同的 。
当然提 之后也是相同的。每 个数,拿走两个 来和提取出的两个 的倍数值进行匹配,无论 的值如何(即使是 ),每组 后的值都将变成 。
现在就变成了,很多个 乘起来,乘最后没完整划分为 个数的那一组,乘上一堆之前提出的 的倍数再 的值,的最后一位非 值是多少。什么是"一堆之前提出的 的倍数再 的值"? 就是说提出的 这些数,每一个 ,提出的 与提出的 乘在一起变成 扔掉,就变成了
这一共有 个数。也就是
最后的那几个分不了组的数
。
聪明的你会发现,对于 的最后一个非 数,一定是偶数,换句话说就是 中的一个。,,,。 与能成为答案的数相乘都是不改变值的所以我们干脆每20个数分成一组,每一组为原来的两组,提出 和 之后的值是 。 与任何一个答案值乘在一起是不会变的,所以我们可以当做没看见。
对于最后面的几个数显然是可以预处理的。所以现在答案变成了 预处理 预处理
把预处理的数组放到 上面就好了。
也就是说如果你理解了的话, 数组是
的前缀和。不对,前缀乘( )。
所以代码几乎是只要维护一个
区区位的高精除。复杂度 。我写的太丑,就不放了。
- 1
信息
- ID
- 1567
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者