POJ 2417 BSGS模板

54 篇文章 0 订阅
14 篇文章 0 订阅

传送门


题目大意:
A^x=B(%mod),求x


分析:
BSGS
详情请见http://www.cnblogs.com/yuiffy/p/3877381.html


代码如下:
(当然是抄的模板……>_<)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
int A,B,MOD,t,D,ans,m;
class hash{
    public:
        hash(){
            memset(a,-1,sizeof(a));
        }
        int locate(int x){
            int l=x%mod;
            while(a[l]!=x&&a[l]!=-1)
                l=(l+1)%mod;
            return l;
        }
        void insert(int x,int val){
            int l=locate(x);
            if(a[l]==-1)
                a[l]=x,v[l]=val;
        }
        int get(int x){
            int l=locate(x);
            return a[l]==x?v[l]:-1;
        }
        void clear(){
            memset(a,-1,sizeof(a));
        }
    private:
        static const int mod=100007;
        int a[mod+100],v[mod+100];
}S;
int ex_gcd(int a,int b,int &x,int &y){
    if(b==0)
        return x=1,y=0,a;
    int s=ex_gcd(b,a%b,x,y),tmp=x;
    x=y,y=tmp-a/b*y;
    return s;
}
void BSGS(){
    S.clear(),m=ceil(sqrt((double)MOD)),t=1;
    for(int i=0;i<m;i++)//Baby Step
        S.insert(t,i),t=t*A%MOD;
    D=1,ans=-1;
    int x,y;
    for(int i=0;i<m;i++){
        ex_gcd(D,MOD,x,y);//x=1/A^(i*m).....D在%MOD意义下的逆元
        x=((x*B)%MOD+MOD)%MOD,y=S.get(x);
        if(y!=-1){
            ans=i*m+y;
            break;
        }
        D=(D*t)%MOD;//D=t^i=A^(i*m)
    }
    if(ans==-1)
        printf("no solution\n");
    else
        printf("%lld\n",ans);
}
signed main(void){
    while(scanf("%lld%lld%lld",&MOD,&A,&B)!=EOF){
        BSGS();
    }
    return 0;
}

by >_< neighthorn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值