POJ 2417 baby_step giant_step 小步大步算法 a^x == b(mod n) 求解0<=x<n的值

来源:互联网 发布:淘宝首页全屏海报尺寸 编辑:程序博客网 时间:2024/05/16 15:43

题目照片:http://poj.org/problem?id=2417

题意:求解a^x==b(mod n),==表示同余的意思。

解法:大步小步算法裸题,我也不懂这个算法,先存个模板,应该有用。 复杂度是O(sqrt(n)*log(n))的

///POJ 2417#include <stdio.h>#include <cmath>#include <string.h>#include <stdlib.h>#include <iostream>typedef long long LL;#define MOD 76543int hs[MOD], head[MOD], nxt[MOD], id[MOD], top;void insert(int x, int y){    int k=x%MOD;    hs[top]=x, id[top]=y, nxt[top]=head[k], head[k]=top++;}int find(int x){    int k=x%MOD;    for(int i=head[k];~i;i=nxt[i]){        if(hs[i]==x){            return id[i];        }    }    return -1;}int BSGS(int a, int b, int n){    memset(head,-1,sizeof(head));    top=1;    if(b==1) return 0;    int m=sqrt(n*1.0), j;    long long x=1,p=1;    for(int i=0; i<m; ++i, p=p*a%n) insert(p*b%n,i);    for(long long i=m; ; i+=m){        if((j=find(x=x*p%n))!=-1) return i-j;        if(i>n) break;    }    return -1;}int main(){    int a, b, n;;    while(~scanf("%d%d%d",&n,&a,&b)){        int ans=BSGS(a,b,n);        if(ans==-1) printf("no solution\n");        else printf("%d\n", ans);    }    return 0;}
0 0