POJ - 2417 · Discrete Logging

BSGS模板題:

#include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <cmath>
#include <cstdio>

using namespace std;
typedef long long ll;
ll b, l, n, p;
ll a;

ll quick_mod(ll a, ll b, ll n) {
    ll ans = 1;
    while(b) {
        if(b&1) {
            ans = ans*a%n;
        }
        a = a*a % n;
        b >>= 1;
    }
    return ans%n;
}
ll anss;
bool BSGS() {
    map<ll, ll> mp;
    ll m = ceil(sqrt(p+0.5));
    ll cns = 1;
    cns = b % p;
    for (int j = 1; j <= m; j++) {
        cns = cns * a % p;
        mp[cns] = j;
    }
    ll cnss = quick_mod(a, m, p);
    ll ress =  1;
    for (int i = 1; i <= m; i++) {
        ress = ress * cnss % p;
        if(mp[ress]) {
            anss = i * m - mp[ress];
            return true;
        }
    }
    return false;
}


int main() {
    ios::sync_with_stdio(false);
    while(cin >> p >> a >> b) {
        bool flag = BSGS();
        if(!flag) {
            cout << "no solution" << endl;
        }
        else {
            cout << (anss % p + p) % p << endl;
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章