bsgs整理
目錄
- bsgs問題 或 poj2417:
- 概述
- 代碼
- exbsgs
- 鳴謝 \(gzy gzy gzy\)
bsgs問題 或 poj2417:
給定質數\(p\),給定\(a\),\(b\),\((a,p)=1\)
求出最小的整數x,使得\(a^{x}≡b(mod p)\)
概述
由費馬小定理可以知道
\(a^{x+p-1}≡a^{x}≡b(mod p)\)
所以如果有解那\([0,p-1]\)區間內一定會出現解
讓\(m=sqrt(p)\)
\(x\)可以表示為\(m*i-j\)
那\(m,i,j\)都是在根號規模的
\(a^{m*i-j}≡b(mod p)\)
\(\frac{a^{m*i}}{a^{j}}≡b(mod p)\)
\(a^{m*i}≡b*a^{j}(mod p)\)
右邊\(hash\)表(一般都用stl的map)存在所有的j取值
左邊暴力枚舉i(因為是-j,所以從1枚舉,要不然就成負數了,找出來的就不一定是最小解)
如果\(a^{m*i}\)在hash表中存在,那就有解,也是最小解,結束吧
如果根號范圍內還沒有解,那就真的沒解
算法思想:分塊
算法缺陷:p是質數
算法復雜度\(\sqrt{n}\)
\(map\)常數也許很高
代碼
#include <iostream> #include <cmath> #include <map> #include <cstdio> #define ll long long using namespace std; ll a,b,p; map<ll,ll> hasH; int main() {while(scanf("%lld%lld%lld",&p,&a,&b)!=EOF) {ll m=floor(sqrt(p));hasH.clear();ll tmp=1;hasH[b]=1;for(ll i=1;i<=m;++i) tmp=tmp*a%p,hasH[tmp*b%p]=i+1;ll xx=tmp,i=1,ans=-1;for(;i<=m;++i) {if(hasH[xx]) {ans=m*i%p-(hasH[xx]-1);break;}xx=xx*tmp%p;}if(ans==-1) puts("no solution");else printf("%d\n",ans);}return 0; }exbsgs
咕咕咕咕
鳴謝 \(gzy gzy gzy\)
轉載于:https://www.cnblogs.com/dsrdsr/p/10352136.html
總結
- 上一篇: 《领域驱动设计》第二部分:模型驱动设计的
- 下一篇: jvm_2