求助,一直re,qwq
查看原帖
求助,一直re,qwq
247546
Xing_ke楼主2020/7/24 17:27
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0;int f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){ x=x*10+ch-'0';ch=getchar();	}
	return x*f;
}

int a,p,b;
map<int,int> vis;

inline int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}

inline int exgcd(int a,int b,int &x,int &y){
	if(!b)x=1,y=0;
	else {
		exgcd(b,a%b,x,y);
		int t=x;x=y;
		y=t-a/b*y;
	}
}

inline int inv(int a,int b){
	int x,y;
	exgcd(a,b,x,y);
	return (x%b+b)%b;
}

inline int Qow(int a,int b,int p){
	int ans=1;
	while(b){
		if(b&1) ans=ans*a%p;
		a=a*a%p;
		b>>=1;
	}
	return ans%p;
}

inline int BSGS(int a,int b,int p){
	vis.clear();
	
	int m=ceil(sqrt(p));b%=p;
	
	for(int i=1;i<=m;++i)
		b=b*a%p,vis[b]=i;
	
	int tmp=Qow(a,m,p);
	b=1;
	
	for(int i=1;i<=m;++i){
		b=b*tmp%p;
		if(vis[b])return (i*m-vis[b]+p)%p;
	}
	return -1;
}

inline int EX_bsgs(int a,int b,int p){
	if(b==1||p==1)return 0;
	
	int g=gcd(a,p),k=0,v=1;
	
	while(g>1){
		if(b%g!=0)return -1;
		
		k++;b/=g;p/=g;v=v*(a/g)%p;
		
		if(v==b)return k;
		
		g=gcd(a,p);
	}
	int t=BSGS(a,b*inv(v,p)%p,p);
	if(t==-1)return -1;
	return t+k;
}

signed main(){
	a=read();p=read();b=read();
	
	while(a&&b&&p){
		a%=p;b%=p;
		int t=EX_bsgs(a,b,p);
		if(t==-1)printf("No Solution\n");
		else printf("%lld\n",t);
		a=read();p=read();b=read();
	}
	return 0;
}

帮帮忙吧,跳闸了qwq

2020/7/24 17:27
加载中...