HYSBZ - 2242
**
Description
**
你被要求设计一个计算器完成以下三项任务:
1、给定y,z,p,计算Y^Z Mod P 的值;
2、给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数;
3、给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数。
没网了真是悲伤QAQ 【sisi上课把网断了TAT】
来说一下BSGS吧QAQ
觉得白皮上说的很清楚的QAQ 看一遍就明白了 这里总结一下吧【感觉就是还没回过神来就证明完了QAQ】
首先我们通过欧拉定理可以知道 我们需要试 0~p-1 这些数 【剩余系其实就可以知道 证:最多有n个剩余系【意思就是最多有p个数%p不同】 如果第p+1个数一定之前存在一个数和它相同 【其实就是抽屉原理】 然后就开始了之前那个数的循环 END】
所以我们有了一个范围了QAQ【有木有顿时好心安QAQ】
但是p最大是 1e9 不在我们的承受范围之内 ! 肿么办???
这里BSGS【大步小步定理 baby step, gaint step 】就派上用场了
首先我们随便找一个m 只要满足 m < p 【在最后我们在根据之间的推断选取一个较好的m】
我们先把1~m这些数试一下 如果有 就输出答案
否则!!
我们还要尝试一下后面的【QAQ】 【读者:woc……你不废话么……】
别急别急【QAQ】
我们先求出 y^m在(mod p)下的逆元 【读者:这么大怎么求】
费马是个好人啊 [233]
**费马小定理 :
假如p是质数,若p不能整除a,则 a^(p-1) ≡1(mod p),若p能整除a,则a^(p-1) ≡0(mod p)**
证明:
因为p是质数,且(a,p)=1,所以φ(p)=p-1。由欧拉定理可得a^(p-1) ≡1(mod p)【我记得当初是这么证来着 至于欧拉定理怎么证么……我怎么知道 QAQ 只是这里比较简洁 如果不知道欧拉定理 可以去百度搜费马小定理 那里应该没有涉及欧拉定理的知识】
所以y^m的逆元是 y^(p-m-1) 【因为两个相乘就是满足费马小定理的这种形式了=> m^(p-1) ≡1(mod p)】
OOOOOOOOOOOOOOO———我是分割线———OOOOOOOOOOOOOO
对于 一个x>m 我们这里设成 m+k 如果它满足题目条件的话 => Y^(m+k)≡ Z ( mod P)
我们在同余式两边同时乘 刚才求出的逆元 式子就变成了 Y^k≡ Z×(y^p-m-1) ( mod P)
这样 m+k 就变成了 k 如果k还是大于m的话 我们再乘以逆元 就不断变小 直到 k<m 所以我们可以保持式子左边不动 枚举右面的b 每次查询是否在1~m里有答案 否则就不断乘逆元 需要n/m次
前面是小步 后面是大步 先小步再大步 应该名字是这么来的吧
END
【貌似讲着讲着就乱了【捂脸】】
代码可以去看黄学长的QAQ 我的模板挂掉了TAT 调了好久好久……最后弃疗了TAT