spoj3105 MOD - Power Modulo Inverted(exbsgs)

裸的ex_bsgs,不懂ex_bsgs的可以看看这篇博客---->超级跳转

#include<bits/stdc++.h>
#define ll long long
using namespace std;
map<ll,ll> mp; 
ll gcd(ll x,ll y)
{
	return y==0?x:gcd(y,x%y);
}
ll powmod(ll x,ll y,ll mod)
{
	ll sum=1;
	while(y)
	{
		if(y&1)
		{
			sum=sum*x%mod;
		}
		x=x*x%mod;
		y>>=1;
	}
	return sum;
}
void ex_bsgs(ll a,ll b,ll mod)
{
     ll i,j;
     if(b==1)
     {
     	printf("0\n");
     	return;
     }
     ll k=0,x=1;
     while(true)
     {
     	ll d=gcd(a,mod);
     	if(d==1) break;
     	if(b%d)
     	{
     		printf("No Solution\n");
     		return;
     	}
     	mod/=d,b/=d,++k,x=x*a/d%mod;
     	if(x==b)
     	{
     		printf("%lld\n",k);
     		return;
     	}
     }
     mp.clear();
     ll m=sqrt(mod)+1,t,tt;
     for(i=0,t=b;i<m;i++,t=t*a%mod) mp[t]=i;
     for(i=1,tt=powmod(a,m,mod),t=x*tt%mod;i<=m;i++,t=t*tt%mod)
     {
     	j=mp.find(t)==mp.end()?-1:mp[t];
		 if(j>=0&&i*m-j+k>=0)
		 {
		 	printf("%lld\n",i*m-j+k);
		 	return;
		 } 
     }
} 
int main()
{
	ll i,j,x,z,k;
	while(true)
	{
		scanf("%lld%lld%lld",&x,&z,&k);
		if(k==0&&z==0&&x==0) break;
		ex_bsgs(x,k,z);
	}
	return 0;
} 
posted @ 2019-10-18 19:03  yzxx_qwq  阅读(181)  评论(0编辑  收藏  举报