zoukankan      html  css  js  c++  java
  • 【数论】Baby Step Giant Step

    被数论怒虐了一天 心力憔悴啊 感觉脑细胞已经快消耗殆尽了>_< 但是今天还是会了很多之前觉得特别神的东西

    比如BSGS 之前听了两遍 好像都因为听得睡着了没听懂-。- 今天终于硬着头皮学会了~ 做个总结吧 免得又忘记- -

    BSGS:

    BSGS就是求 A^x=B(mod C) 0<=x<C的解(C为素数)

    做一个转换 设m*i+j=x (m=trunc(sqrt(C)))

    将A^i(0<=i<m) 存入hash表中(i,A^i)

    这样我们就能O(1)求出A^x=B 对应的x的值

    设AA=(A^m^i)mod C 枚举i的值(0<=i<m)

    原方程就变为 AA*(A^j)=B(mod C)

    因为C为素数 所以(AA,C)=1

    故 可以用拓展欧几里德求出A^j值为多少 再在hash中找A^j对应的j 答案get

    其实不难发现这是个神奇的分块思想 将n分为√n块

    预处理使得计算每块的复杂度降为O(1) 到达加速

    拓展BSGS:

    上题中有一个限制条件 C为素数 如果没有这个条件要怎么做呢

    以下是AC大神的做法 由AK大神跟我讲解(orz两个神犇)

    A^x=B(mod C)

    先将这个方程转换为 A^x+Cy=B

    设 A’=A/(A,C),C'=C/((A,C)^z) (C’与(A,C)^z互质)

    将方程左右都除以(A,C)^z (如果B不能整除(A,C)^z 则无解)

    会得到:

    (A'^z)*A^(x-z)+C'y=B/((A,C)^z)

    这时 将A'^z视为系数 A与C’互质就能用上面的方法求解了

  • 相关阅读:
    PAT 1032 (未完成)
    PAT 1031
    PAT 1030
    将爬取到的数据存入数据框并导出
    XPath常见用法
    python 图表
    Protobuf在Unity中的通讯使用
    ProtoBuf在Unity中的使用
    Unity更新资源代码
    匿名函数
  • 原文地址:https://www.cnblogs.com/g-word/p/3373184.html
Copyright © 2011-2022 走看看