QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#931055 | #5. 在线 O(1) 逆元 | panhongxuan | 60 | 4526ms | 42884kb | C++14 | 3.3kb | 2025-03-10 19:05:26 | 2025-03-10 19:05:28 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
namespace MyNamespace {
typedef long long ll;
inline namespace MyIO {
inline ll rd() {
char ch = getchar();
ll s = 0, w = 1;
while (!isdigit(ch)) {
if (ch == '-') w = -1;
ch = getchar();
}
while (isdigit(ch)) {
s = (s << 3) + (s << 1) + (ch ^ 48);
ch = getchar();
}
return (s * w);
}
template<typename T>
inline void wr(T x) {
if (x < 0) x = -x, putchar('-');
if (x > 9) wr(x / 10);
putchar(x % 10 + 48);
}
inline void wrsp() {
// pass
}
template<typename T, typename... Args>
inline void wrsp(T x, Args... args) {
wr(x), putchar(' '), wrsp(args...);
}
inline void wrln() {
putchar('\n');
}
template<typename T>
inline void wrln(T x) {
wr(x), putchar('\n');
}
template<typename T, typename... Args>
inline void wrln(T x, Args... args) {
wr(x), putchar(' '), wrln(args...);
}
} // namespace MyIO
inline namespace Base {
#define bug(x) << #x << '=' << (x) << ' '
#define siz(A) ll((A).size())
template<typename T>
constexpr inline T& Max(T &x, const T &y) {
return x = max(x, y);
}
template<typename T>
constexpr inline T& Min(T &x, const T &y) {
return x = min(x, y);
}
} // namespace Base
namespace {
ll MO;
inline ll moa(ll x) {
return (x >= MO ? x - MO : x);
}
inline ll moi(ll x) {
return (x < 0 ? x + MO : x);
}
inline ll mo(ll x) {
return moi(x % MO);
}
inline ll& Moa(ll &x) {
return x = moa(x);
}
inline ll& Moi(ll &x) {
return x = moi(x);
}
inline ll& Mo(ll &x) {
return x = mo(x);
}
inline ll qpow(ll x, ll y) {
Mo(x);
ll k = 1;
while (y) {
if (y & 1) (k *= x) %= MO;
(x *= x) %= MO;
y >>= 1;
}
return k;
}
inline ll get_inv(ll x) {
return qpow(x, MO - 2);
}
}
constexpr ll B = 1000, fsqB = 1e6 + 10;
constexpr ll BK = B + 10, sqB = fsqB + 10;
ll inv[sqB];
ll nume[sqB], deno[sqB];
ll pre[sqB], nxt[sqB];
void init(ll _MO) {
MO = _MO;
inv[0] = inv[1] = 1;
for (ll i = 2; i <= fsqB; ++i)
inv[i] = (MO - MO / i) * inv[MO % i] % MO;
tie(nume[0], deno[0]) = make_tuple(0, 1);
tie(nume[B * B], deno[B * B]) = make_tuple(1, 1);
for (ll i = 2; i <= B; ++i)
for (ll j = 1; j < i; ++j) {
ll v = j * B * B / i;
if (!deno[v])
tie(nume[v], deno[v]) = make_tuple(j, i);
}
for (ll i = 0, lst = 0; i <= fsqB; ++i) {
if (deno[i]) lst = i;
pre[i] = lst;
}
for (ll i = fsqB, lst = fsqB; i >= 0; --i) {
if (deno[i]) lst = i;
nxt[i] = lst;
}
}
inline ll calc(ll x, ll v) {
ll d = deno[v] * x - nume[v] * MO;
if (abs(d) > fsqB) return -1;
if (d >= 0) return inv[d] * deno[v] % MO;
else return mo(-inv[-d] * deno[v]);
}
inline ll lget_inv(ll x) {
if (x <= fsqB) return inv[x];
if (moi(-x) <= fsqB) return moi(-inv[moi(-x)]);
ll v = x * B * B / MO;
ll res = calc(x, pre[v]);
if (~res) return res;
else return calc(x, nxt[v]);
}
} // namespace MyNamespace
void init(int p) {
MyNamespace::init(p);
}
int inv(int x) {
return MyNamespace::lget_inv(x);
}
// int n, p;
// int main() {
// cin >> n >> p;
// init(p);
// for (int i = 1; i <= n; ++i) {
// int x;
// cin >> x;
// cout << inv(x) << ' ' << MyNamespace::get_inv(x) << endl;
// assert(inv(x) == MyNamespace::get_inv(x));
// }
// return 0;
// }
Details
Pretests
Final Tests
Test #1:
score: 10
Accepted
time: 19ms
memory: 42868kb
Test #2:
score: 20
Accepted
time: 875ms
memory: 42816kb
Test #3:
score: 30
Accepted
time: 4526ms
memory: 42884kb
Test #4:
score: 0
Time Limit Exceeded
Test #5:
score: 0
Time Limit Exceeded