2 条题解

  • 1
    @ 2016-11-17 14:24:28

    这道题把O(m)的算法优化一下即可AC
    也就是在计算的时候
    只把取值为0的x记录下来
    再判断这个值是否在每个模数下都出现
    就AC了
    (也许是数据水了

  • 0
    @ 2014-11-17 12:30:02

    我来说一下这个题目怎么做. sujiao作为出题人, 如果有空最好也发一下说明, 估计小朋友等不动年鉴了...

    (1) 先说一下O(nm)的算法. 大家应该都知道可以把所有系数A_i都mod一个大素数, 之后在O(n)内判定一个数字x是不是解的方法了. 那么直接用这样的方法可以判定所有的数字, 时间复杂度是O(nm)的, 在noip现场应该可以得到期望得分70分. 在加强版的题目中应该可以得到40分.

    (2) 再说一下O(m)的算法, 这个算法应该是可以在noip现场轻松通过所有数据的. 因为O(nm)会超时, 那么我们不妨只考虑1<=x<=K<m的所有数字是不是解, 时间复杂度O(nk), 这里k需要自己选取. 之后对于1<=x<=m, 我们可以用已经算出来的x%k的结果, 去很大概率估计x是不是解. 有着更强正确率的方法是, 寻找若干个不同的k, 甚至最好选取k个大小相差不多的素数, 比如说我们选取10个k0,k1,...,k9. 那么x是不是根就利用x%ki来判定.

    (3) O(n^3+nsqrt(m))的算法, 我们选取素数p0,p1满足p0^2>=m,p1^2>m.然后在mod(pi)意义下算出来0<=x<pi的所有根, 这一部分的时间复杂度是O(nsqrt(m))的. 可以说明, 找到的两组根都不超过n个, 我们记为t1,t2,...,tu和s1,s2,...,sv. 那么我们断言原问题的可行根x一定可以通过某一个ti和某一个sj组合得到, 再利用O(n)的方法判定是不是根. 这一部分的时间复杂度是O(n^3), 这样可以通过所有的数据.

    最后散扯一句, 利用heoi2012的Akai的数学作业一题的方法, 可以在noip现场骗到满分. heoi2012这个题目当年就是我出的, 所以过一段时间我就在vijos上挂出来. [等我找到遗失的数据之后...=_=...]

    • @ 2014-11-29 18:47:17

      请问解法三中 找到的两组根都不超过n个是为什么? 是根据n次方程最多有n个解么,但是这是同余方程,比如模p,左边可以使0,p,2p,3p... 左边等于kp,对于每个k,都可能有n个解吧... 大神能解释一下么。
      还有原问题的可行根x一定可以通过某一个ti和某一个sj组合得到 这又是为什么呢。

  • 1

信息

ID
1915
难度
8
分类
(无)
标签
(无)
递交数
201
已通过
23
通过率
11%
被复制
1
上传者