求解:
code:
const int maxn=(1<<16)-1;
struct HASH{
int v[maxn+1],tot,ed=0;
struct node{
int t,p,next;
}a[maxn<<1];
void ins(int x,int y) {
int k=x&maxn;
if(v[k]!=ed) {
v[k]=ed;
a[k].t=x,a[k].p=y,a[k].next=0;
}
else {
for(;;k=a[k].next) {
if(a[k].t==x) return a[k].p=y,void();
if(!a[k].next) break;
}
a[k].next=++tot,a[tot].t=x,a[tot].p=y,a[tot].next=0;
}
}
int find(int x) {
int k=x&maxn;
if(v[k]!=ed) return -1;
for(;;k=a[k].next)
if(a[k].t==x) return a[k].p;
else if(!a[k].next) return -1;
}
}mp;
int bsgs(int a,int b,int p) {
if(!a) {
if(!b) return 1;
else return -1;
}
if(b==1||p==1) return 0;
mp.tot=maxn;
int m=ceil(sqrt(p));
ll tmp=1,s=1;
for(int j=0; j<m; ++j)
mp.ins(tmp*b%p,j),tmp=tmp*a%p;
for(int i=1; i<=m; ++i) {
s=s*tmp%p;
if(~mp.find(s)) return i*m-mp.find(s);
}
return -1;
} 求解:
code:
const int maxn=(1<<16)-1;
struct HASH{
int v[maxn+1],tot,ed=0;
struct node{
int t,p,next;
}a[maxn<<1];
void ins(int x,int y) {
int k=x&maxn;
if(v[k]!=ed) {
v[k]=ed;
a[k].t=x,a[k].p=y,a[k].next=0;
}
else {
for(;;k=a[k].next) {
if(a[k].t==x) return a[k].p=y,void();
if(!a[k].next) break;
}
a[k].next=++tot,a[tot].t=x,a[tot].p=y,a[tot].next=0;
}
}
int find(int x) {
int k=x&maxn;
if(v[k]!=ed) return -1;
for(;;k=a[k].next)
if(a[k].t==x) return a[k].p;
else if(!a[k].next) return -1;
}
}mp;
int gcd(int a,int b) {
if (a<b) return gcd(b,a);
if (!b) return a;
return gcd(b,a%b);
}
int bsgs(int a,int b,int p,int na) {
if(!a) {
if(!b) return 1;
else return -1;
}
if(b==na||p==1) return 0;
mp.tot=maxn;
int m=ceil(sqrt(p));
ll tmp=1,s=na;
for(int j=0; j<m; ++j)
mp.ins(tmp*b%p,j),tmp=tmp*a%p;
for(int i=1; i<=m; ++i) {
s=s*tmp%p;
if(~mp.find(s)) return i*m-mp.find(s);
}
return -1;
}
int exbsgs(int a,int b,int p) {
if(b==1||p==1) return 0;
int g=gcd(a,p),k=0,na=1;
while(g>1) {
if(b/g*g!=b) return -1;
++k,p/=g,b/=g,na=1LL*na*(a/g)%p,g=gcd(a,p);
if(na==b) return k;
}
int x,y,res;
res=bsgs(a,b,p,na);
if(res==-1) return -1;
else return res+k;
}
signed main() {
int a,p,b;
while(cin>>a>>p>>b) {
if(!a&&!p&&!b) return 0;
a%=p,b%=p,++mp.ed;
int x=exbsgs(a,b,p);
if(~x) cout<<x<<'\n';
else cout<<"No Solution\n";
}
return 0;
} 求解:
求出的所有解。

京公网安备 11010502036488号