被数论怒虐了一天 心力憔悴啊 感觉脑细胞已经快消耗殆尽了>_< 但是今天还是会了很多之前觉得特别神的东西
比如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’互质就能用上面的方法求解了