#include<map>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll a,b,P;
map<ll,ll> mp;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
ll power(ll a,ll b){
ll s=1;
for (;b;b/=2,a=a*a%P)
if (b&1) s=s*a%P;
return s;
}
ll exbsgs(ll a,ll b,ll p){
if (b==1) return 0;
ll t,d=1,k=0;
while ((t=gcd(a,p))!=1){
if (b%t) return -1;
k++;
b/=t; p/=t;
d=d*(a/t)%p;
if (b==d) return k;
}
mp.clear();
ll m=ceil(sqrt(p));
ll a_m=power(a,m),mul=b;
for (ll j=1;j<=m;j++){
mul=mul*a%p;
mp[mul]=j;
}
for (ll i=1;i<=m;i++){
d=d*a_m%p;
if (mp[d]) return i*m-mp[d]+k;
}
return -1;
}
int main(){
while (scanf("%lld%lld%lld",&a,&P,&b)!=EOF){
if (!a&&!b&&!P) break;
ll ans=exbsgs(a%P,b%P,P);
if (ans!=-1ll) printf("%lld\n",ans);
else puts("No Solution");
}
}
bzoj1467: Pku3243 clever Y
最新推荐文章于 2018-02-26 11:04:00 发布