[模板]exbsgs求助 /kk WA7个点
查看原帖
[模板]exbsgs求助 /kk WA7个点
84025
Kiel楼主2021/10/15 09:58
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<bitset>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 1e9
#define pii pair<int,int> 
using namespace std;
typedef long long ll;
inline int rd(){char c=getchar();int tot=1;while ((c<'0'|| c>'9')&&c!='-') c=getchar();if (c=='-'){tot=-1;c=getchar();}
ll sum=0;while (c>='0'&&c<='9'){sum=sum*10+c-'0';c=getchar();}return sum*tot;}
const int N=1e5+10;
map<ll,int>mp;
ll exbsgs(ll a,ll b,ll p){
	a%=p,b%=p;
	mp.clear();
	ll a1=1,nm=0,g=__gcd(a,p);
//	printf("%d=%d mod %d %d %d\n",a,b,p,a1,nm);
	while(g!=1){
		a1=a1*a/g%p;
		if(b%g!=0)return inf;
		b/=g;p=p/g;
		g=__gcd(a,p);
		nm++;
	}
	ll up=sqrt(p);
	for(ll i=0,j=b%p;i<up;i++,j=j*a%p){
		mp[j]=i;
	}
	ll k=a1,Min=inf;
	for(ll i=1;i<=up;i++,k=k*a%p);
	for(ll i=1,j=k;i<=up;i++,j=j*k%p){
		if(mp.find(j)!=mp.end()){
			Min=min(Min,1ll*up*i-mp[j]);
		}
	}
	return Min==inf?inf:nm+Min;
}
int main(){
	ll a,b,p;
	while((a=rd())+(p=rd())+(b=rd())!=0){
		int res=exbsgs(a,b,p);
		if(res>=inf)puts("No Solution");
		else printf("%d\n",res);
	}
	return 0;
}
/*
2 4 0
0 0 0
###### */

错误数据 27098245 633810670 415037555 正确输出50317120

2021/10/15 09:58
加载中...