求解 x k = y ( m o d p ) x ^ k = y (mod p) xk=y(modp) ( x x x 与 p p p 不互质) 类似方程的最小正整数解
具体解析推荐参考这位兄台的博客(~ ̄▽ ̄)~点我啊~~
模板题 : P4195 【模板】exBSGS/Spoj3105 Mod
#include<bits/stdc++.h>
#define rint register int
#define deb(x) cerr<<#x<<" = "<<(x)<<'\n';
using namespace std;
typedef long long ll;
typedef pair <int,int> pii;
struct HashTable{
static const int HashMod = 123456;
struct Line{int u,v,next;} e[100005];
int h[HashMod], cnt;
void add(int u,int v,int w){e[++cnt]=(Line){w,v,h[u]};h[u]=cnt;}
void clear(){memset(h,cnt=0,sizeof(h));}
void insert(int x, int i){
int k = x % HashMod;
add(k, i, x);
}
int query(int x){
for(int i=h[x%HashMod];i;i=e[i].next)
if(e[i].u==x) return e[i].v;
return -1;
}
} Hash;
int qpow(int a, int b, int p){
int ret = 1;
while(b){
if(b & 1) ret = 1ll * ret * a % p;
a = 1ll * a * a % p;
b >>= 1;
}
return ret;
}
void exgsbs(int x, int y, int p){
if(y==1) {puts("0");return;}
int d = __gcd(x, p), k = 1, t = 0;
while(d^1){
if(y%d) {puts("No Solution");return;}
++t; y/=d; p/=d; k=1ll*k*x/d%p;
if(y==k) {printf("%d\n", t);return;}
d=__gcd(x, p);
}
Hash.clear();
int s = y, m = sqrt(p) + 1;
for(int i=0; i<=m; i++){
Hash.insert(s, i);
s = 1ll * s * x % p;
}
s = k, k = qpow(x, m, p);
for(int i=1; i<=m; i++){
s = 1ll * s * k % p;
int hash = Hash.query(s);
if(hash == -1) continue;
printf("%d\n", i*m-hash+t);
return;
}
puts("No Solution");
}
int main() {
int p, x, y;
while(1){
scanf("%d%d%d", &x, &p, &y);
if(!x && !p && !y) break;
exgsbs(x, y, p);
}
}