Luogu3846 [TJOI2007] 可愛的質數/【模板】BSGS
阿新 • • 發佈:2020-07-22
https://www.luogu.com.cn/problem/P3846
\(BSGS\)
\(BSGS\)可以\(O( \sqrt{p} )\)處理:
\[b^l \equiv n (mod \quad p) \]
處理方法十分常規
\[令t=\sqrt{p}+1\\ 設l=kt-m\\ 則b^{kt-m} \equiv n (mod \quad p)\\ b^{kt} \equiv nb^m (mod \quad p)\\ 預處理出 nb^m(0 \le m<t)\\ 用b^{kt} \mod p去匹配(map或Hash表)\\ \]
\(C++ Code:\)
#include<iostream> #include<cstdio> #include<cmath> #include<map> #define ll long long using namespace std; ll p,b,n; map<ll,int>a; ll ksm(ll x,ll y) { ll ans=1; while (y) { if (y&1) ans=ans*x%p; x=x*x%p; y >>=1; } return ans; } int main() { scanf("%lld%lld%lld",&p,&b,&n); if (n==1) { printf("0\n"); return 0; } int g=(int)sqrt(p)+1; ll c=n%p; for (int i=0;i<g;i++) { a[c]=i+1; c=c*b%p; } ll y=ksm(b,g); ll e=1; for (int i=1;i<=g;i++) { e=e*y%p; if (a[e]) { printf("%lld\n",(ll)i*g-(ll)(a[e]-1)); return 0; } } puts("no solution"); return 0; }