题目照片: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 76543
int 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;
}