[BZOJ3239][BSGS]Discrete Logging
阿新 • • 發佈:2018-12-31
題意
求的最小非負整數解
BSGS裸題
自己推一下:
令 ,,
已知
由費馬小定理得(詳細見程式碼後*)
那麼inv就可以處理出來了。
把hash存一下
再求在hash表中查詢。
#include <cstdio>
#include <map>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
int p,b,n;
map<int,int> Mp;
inline int powf(ll x,int y,int p){
int k=1; x%=p;
while(y){
if(y&1) k=k*x%p;
x=x*x%p;
y>>=1 ;
}
return k;
}
inline void solve(int y,int z,int p){
y%=p;
if(!y&&!z) {puts("1");return;}
if(!y) {puts("no solution");return;}
ll t=ceil(sqrt(p)),k=1,ine=1;
Mp.clear(); Mp[1]=0;
for(int i=1;i<t;i++){
k=1ll*k*y%p;
if(Mp.count(k)) continue;
Mp[k]=i;
}
int tmp=powf(y,p-t-1 ,p);
for(int i=0;i<t;i++){
if(Mp.count(z*ine%p)) {printf("%d\n",i*t+Mp[z*ine%p]);return;}
ine=1ll*ine*tmp%p;
}
puts("no solution");
}
int main(){
while(~scanf("%d%d%d",&p,&b,&n)) solve(b,n,p);
}
*
上下同乘
又因為費馬小定理得