专栏文章

题解:P2312 [NOIP 2014 提高组] 解方程

P2312题解参与者 3已保存评论 5

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
5 条
当前快照
1 份
快照标识符
@miqd1xdw
此快照首次捕获于
2025/12/04 02:48
3 个月前
此快照最后确认于
2025/12/04 02:48
3 个月前
查看原文
本篇题解不再给出完整代码,想要的同学可以看这篇,里面详细讲解了整道题的思路和代码可能出现的坑点。
回到这里。令等号左边的式子为 f(x)f(x),则当 x[1,m]x \in [1,m] 为解时,有 f(x)=0f(x)=0,也就必然有 f(x)modp=0f(x) \bmod p=0,其中 pp 为我们选取的模数。
反过来,当 f(x)modp=0f(x) \bmod p=0 时,不一定有 f(x)=0f(x)=0。我们只有尽可能地选取合适的模数,来降低出错的概率。这就有几分玄学的意味了——我们得祈祷出题人不卡我们使用的模数!
那么,存不存在一种方式,使得时间复杂度不大幅提升的同时,正确率大幅提高呢?
有的,这就是我们今天要介绍的另一种写法——双模数
首先,我们得明白为什么选取单一模数容易被卡。原因在于,出题人可以很方便地令 f(x)=npf(x)=np,其中 nNn \in N。在这种情况下,f(x)modp=0f(x) \bmod p=0,但 f(x)0f(x) \neq 0
接下来,我们考虑如何改善这种状况。他出题人能卡一个模数,那两个呢?三个?四个……只要我选取的多个模数有一个没有被卡,我就可以确保正确。感性认知一下,这样做的正确率要远高于单一模数。
然而,模数太多也会有一个问题——常数大了。所以,在解决实际问题时,我们往往选取两个模数而非更多,这样既可以提高正确率,又不至于让常数复杂度太大。
具体地,我们应当选取两个不同的模数 p1,p2p1,p2,检查某一 xx 是否为解时,应当检查 f(x)modp1f(x) \bmod p1f(x)modp2f(x) \bmod p2 是否同时为 00

评论

5 条评论,欢迎与作者交流。

正在加载评论...