首页 > 其他 > 详细

spoj3105 MOD - Power Modulo Inverted(exbsgs)

时间:2019-10-18 20:16:09      阅读:63      评论:0      收藏:0      [点我收藏+]

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

spoj3105 MOD - Power Modulo Inverted(exbsgs)

原文:https://www.cnblogs.com/yzxx/p/11700154.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!