TLE on #11求助
查看原帖
TLE on #11求助
182533
Akwamaryna楼主2021/12/22 14:36

90

// Per aspera ad astra.
// 1004535809
#include <cctype>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define re register
#define br break
#define co continue
#define ll long long
#define DEBUG if (dbg)
#ifndef ABC
#define getchar() (_S == _T && (_T = (_S = _B) + fread(_B, 1, 1 << 15, stdin), _S == _T) ? EOF : *_S++)
#endif
char _B[1 << 15], *_S = _B, *_T = _B;
ll fr() {
    re ll s = 0, f = 1;
    re char ch;
    for (; (ch = getchar()) < '0' || ch > '9'; ch == '-' ? f = -f : 0);
    for (; ch >= '0' && ch <= '9'; s = s * 10 + ch - '0', ch = getchar());
    return s * f;
}
int dbg = 0;
#include <map>
#include <cmath>
using namespace std;

template <class T> T cmin(re T a, re T b) {return a < b ? a : b;}
template <class T> T cmax(re T a, re T b) {return a > b ? a : b;}
template <class T> void cswp(re T &a, re T &b) {T t = a;a = b, b = t;}
struct OI {
    int rp, score;
} FJOI2022, CSPS2022;
map<ll, ll> mp;
inline ll qpow(re ll x, re ll k, re ll p) {
    re ll ret = 1;
    while (k) {
        if (k & 1) ret = ret * x % p;
        x = x * x % p; k >>= 1;
    }
    return ret;
}
inline ll gcd(re ll x, re ll y) {return y ? gcd(y, x % y) : x;}
inline void exgcd(re ll a, re ll b, re ll &x, re ll &y) {
    if (!b) return (void)(x = 1, y = 0);
    exgcd(b, a % b, y, x); 
    y -= a / b * x;
}
inline ll inv(re ll a, re ll b) {
    re ll x, y;
    exgcd(a, b, x, y);
    return (x % b + b) % b;
}
inline ll bsgs(re ll a, re ll b, re ll p) {
    mp.clear();
    b %= p;
    re ll k = (ll)sqrt(p) + 1;
    for (re ll i = 0; i < k; ++i) {
        re ll x = b * qpow(a, i, p) % p;
        mp[x] = i;
    }
    a = qpow(a, k, p);
    re ll res = 1;
    if(!a) return b ? -1 : 1;
    for (re ll i = 1; i <= k; ++i) {
        res = res * a % p;
        re int j = mp.find(res) != mp.end() ? mp[res] : -1;
        if ((~j) && i * k - j >= 0) return i * k - j;
    }
    return -1;
}
inline ll exbsgs(re ll a, re ll b, re ll p) {
	if (b == 1 || p == 1) return 0;
	re ll d = gcd(a, p), cnt = 0, A = 1;
	while (d > 1) {
		if (b % d) return -1;
		++cnt; b /= d, p /= d;
		A = A * (a / d) % p;
		if (A == b) return cnt;
		d = gcd(a, p);
	}
	re ll x = bsgs(a, b * inv(A, p) % p, p);
	return (~x) ? x + cnt : x;
}
signed main() {
#ifndef ONLINE_JUDGE
    dbg = 1;
#endif
    ++FJOI2022.rp, ++FJOI2022.score, ++CSPS2022.rp, ++CSPS2022.score, 1004535809;
	re ll a = fr(), p = fr(), b = fr();
    while (p && a && b) {
		a %= p, b %= p;
		re ll x = exbsgs(a, b, p);
		if (~x) printf("%lld\n", x);
		else printf("No Solution\n");
		a = fr(), p = fr(), b = fr();
	}
    return 0;
}
2021/12/22 14:36
加载中...