萌新求助 #11TLE
查看原帖
萌新求助 #11TLE
442626
好人258楼主2021/7/21 17:43
#include<bits/stdc++.h>
#define int long long
using namespace std;
map<int,int> s;
int a,p,b;
inline int read()
{
	register int x=0,y=1;
	register char c=std::getchar();
	while(c<'0'||c>'9'){
		if(c=='-'){
			y=0;
			
		}
		c=std::getchar();
	}
	while(c>='0'&&c<='9'){
			x=x*10+(c^48);
			c=std::getchar();
		}
		return y?x:-x;
}
inline int gcd(int a,int b){
	return b? gcd(b,a%b):a;
}
inline void ex(int a,int b,int &x,int &y){
	if(b==0){
		x=1;
		y=0;
	    return;	
	}
	ex(b,a%b,x,y);
	int mid=x;
	x=y;
	y=mid-a/b*y;
}
inline int ny(int a,int b){
	int x,y;
	ex(a,b,x,y);
	x=(x%b+b)%b;
	return x;
}
inline int ksm(int x,int y,int p){
	int res=1;
	while(y){
		if(y&1) res=((res)*(x))%p;
		x=((x)*(x))%p;
		y>>=1;
	}
	return res;
}
inline int bsgs(int a,int b,int p){
	s.clear();
	int n=ceil(sqrt(p));
	b%=p;
	for(int i=1;i<=n;i++){
	   b=b*a%p;
		s[b]=i;
	}
	b=1;
	int h=ksm(a,n,p);
	for(int i=1;i<=n;i++){
		b=b*h%p;
 if(s[b]) return ((i*n-s[b])%p+p)%p;
	}
	return -1; 
}
inline int bs(int a,int b,int p){
	if(b==1||p==1) return 0;
	int sum=1,n=gcd(a,p),m=0;
	while(n!=1){
		if(b%n!=0) {
		return -1;
		}
	b/=n;
	p/=n;
	sum=sum*(a/n)%p;
	m++;
	if(sum==b) return m;
	n=gcd(a,p);
	}
	int h=bsgs(a,b*ny(sum,p)%p,p);
	if(h==-1) 	return -1;
	return h+m;
} 
signed main(){
	a=read();
	p=read();
	b=read();
	while(a||p||b){
	  a%=p;
          b%=p;
if(bs(a,b,p)==-1) printf("No Solution\n");
		else
		printf("%lld\n",bs(a,b,p));	
		a=read();
		p=read();
		b=read();
	}
	return 0;
}
2021/7/21 17:43
加载中...