BZOJ 3239 [BSGS]

来源:互联网 发布:社区门诊软件 编辑:程序博客网 时间:2024/06/06 04:44

Description

给定A,B,求最小的x,满足AxB(modP)

Solution

BSGS裸题

#include <bits/stdc++.h>using namespace std;typedef long long ll;int A, B, P, Ans;map<int, int> ap;inline int Pow(int a, int b) {    int c = 1;    while (b) {        if (b & 1) c = (ll)c * a % P;        a = (ll)a * a % P; b >>= 1;    }    return c;}inline int Inv(int a, int P) {    return Pow(a, P - 2);}int Log(int a, int b, int p) {    int m = ceil(sqrt(p)), ia = Inv(Pow(a, m), P), res;    res = Inv(b, p);    for (int i = 0; i < m; i++) {        if (!ap.count(res)) ap[res] = i;        res = (ll)res * a % P;    }    res = 1;    for (int i = 0; i <= m; i++) {        if (ap.count(res)) return ap[res] + i * m;        res = (ll)res * ia % P;    }    return -1;}int main(void) {    while (~scanf("%d%d%d", &P, &A, &B)) {        ap.clear();        Ans = Log(A, B, P);        if (Ans == -1) puts("no solution");        else printf("%d\n", Ans);    }}
原创粉丝点击