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;
} 

猜你喜欢

转载自www.cnblogs.com/yzxx/p/11700154.html
mod
今日推荐