QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#153089 | #5. 在线 O(1) 逆元 | YeahPotato | 100 ✓ | 2419ms | 24236kb | C++14 | 737b | 2023-08-29 11:23:27 | 2023-08-29 11:23:27 |
Judging History
answer
#include "inv.h"
#include <bits/stdc++.h>
using namespace std;
const int B = 1 << 10, T = 1 << 20, P = 998244353;
int f[T+1], p[T+1], buf[T*3+3], * I = buf + T;
void init(int) {
for (int i=1; i<=B; i++) {
int s = 0, d = i << 10;
for (int j=1; j<=T; j++) {
if ((s += d) >= P) s -= P;
if (s <= T) {
if (! f[j]) f[j] = i, p[j] = s;
} else if (s >= P - T) {
if (! f[j]) f[j] = i, p[j] = s - P;
} else {
int t = (P - T - s - 1) / d;
s += t * d, j += t;
}
}
}
I[1] = f[0] = 1;
for (int i=2; i<=T<<1; i++)
I[i] = 1ll * (P - P / i) * I[P%i] % P;
for (int i=-1; i>=-T; i--)
I[i] = P - I[-i];
}
int inv(int x) {
return 1ll * I[p[x>>10]+(x&1023)*f[x>>10]] * f[x>>10] % P;
}
詳細信息
Test #1:
score: 30
Accepted
time: 24ms
memory: 24028kb
Test #2:
score: 40
Accepted
time: 271ms
memory: 24064kb
Test #3:
score: 30
Accepted
time: 2419ms
memory: 24236kb