除12外全TLE(悬关)
查看原帖
除12外全TLE(悬关)
614509
c21162wqb楼主2024/7/17 19:04
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,p;
int gcd(int a,int b) {
	if(b==0) return a;
	return gcd(b,a%b);
}
int ksm(int a,int b) {
	int ans=1;
	while(b) {
		if(b&1) ans=ans*a%p;
		a=a*a%p;
		b>>=1;
	}
	return ans;
}
map<int,int>mp;
int bsgs(int a,int b,int m) {
	mp.clear();
	int s=1,t=sqrt(m);
	for(int y=0;y*y<=m;y++) {
		mp[b*s%m]=y;
		s=s*a%m;
	}
	int jl=ksm(a,t);
	s=jl;
	for(int x=1;x<=t;x++) {
		if(mp[s]) return x*t-mp[s];
		s=s*jl%m;
	}
}
signed main() {
	while(1) {
		scanf("%lld%lld%lld",&a,&p,&b);
		if(a==0) break ;
		int np=p,nb=b,d=1,sum=0,f=0;
		while(gcd(a,np)!=1) {
			int dd=gcd(a,np);
			if(b%d!=0) {
				printf("No Solution\n");
				f=1;
				break ;
			} 
			d*=dd,sum++;
			np/=dd,nb/=dd;
		}
		if(f==1) continue ;
		int na=1;
		for(int i=0;i<=sum;i++) {
			if(na%p==b%p) {
				printf("%lld\n",i);
				f=1; 
				break ;
			}
			if(i!=sum) na=na*a%p;
		}
		if(f==1) continue ; 
		b/=d,p/=d;
		printf("%lld\n",bsgs(a,b*na%p*ksm(d,p-2)%p,p)+sum,sum);
	}
	return 0;
}
2024/7/17 19:04
加载中...