QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#203353 | #5. 在线 O(1) 逆元 | _LAP_ | Compile Error | / | / | C++14 | 1.8kb | 2023-10-06 16:53:20 | 2023-10-06 16:55:20 |
Judging History
你现在查看的是测评时间为 2023-10-06 16:55:20 的历史记录
- [2024-11-05 21:52:46]
- 管理员手动重测本题所有提交记录
- 测评结果:Compile Error
- 用时:0ms
- 内存:0kb
- [2024-11-05 21:41:38]
- 管理员手动重测本题所有提交记录
- 测评结果:Compile Error
- 用时:0ms
- 内存:0kb
- [2023-10-06 16:55:20]
- 评测
- 测评结果:Compile Error
- 用时:0ms
- 内存:0kb
- [2023-10-06 16:53:20]
- 提交
answer
#include "inv.h"
#include <bits/stdc++.h>
using namespace std;
//预处理 Farey 序列 $F_{ \sqrt[3]{p} }$ 和 $\sqrt[3]{p}^2$ 内数的逆元
int n, m, P; vector<int> F, init_inv; // n = \sqrt[3]{p}, m = n^2
vector<int> sum, frac;
inline long long ksm(long long a, int b, int Mod) {
long long r = 1;
while(b) {
if(b & 1) r = r * a % Mod;
b >>= 1, a = a * a % Mod;
}
return r;
}
void init(int p) {
::P = p, n = pow(p, 1.0 / 3) + 2; m = n * n;
sum = vector<int>(m + 1, 0), frac.resize(m + 1), init_inv.resize(m + 1);
// 根据 (\lfloor x / y \times n^2) \rfloor 互不相同预处理Farey序列
for(int x = 1; x <= n - 1; x ++) for(int y = 0; y <= x; y ++) {
int i = y * m / x; assert(!sum[i]); sum[i] = 1, frac[i] = y * n + x;
}
for(int i = 1; i <= m; i ++) sum[i] += sum[i - 1];
for(int i = 0; i <= m; i ++) if(frac[i]) F.emplace_back(i);
init_inv[1] = 1;
vector<int> d(m + 1, 0), primes;
for(int i = 2; i <= m; i ++) {
if(!d[i]) primes.emplace_back(i), init_inv[i] = ksm(i, p - 2, p);
for(auto p : primes) {
if(1ll * p * i > m) break;
d[p * i] = p, init_inv[p * i] = 1ll * init_inv[p] * init_inv[i] % P;
if(i % p == 0) break;
}
}
}
int inv(int x) {
int i = 1ll * x * m / P, k = sum[i]; long long f, t; int p, q;
if(k < F.size()) {
f = F[k], p = f / n, q = f - n * p, t = 1ll * x * q - 1ll * p * P;
if(abs(t) <= m) return 1ll * q * (t > 0 ? init_inv[t] : P - init_inv[-t]) % P;
}
if(--k >= 0) {
f = F[k], p = f / n, q = f - n * p, t = 1ll * x * q - 1ll * p * P;
if(abs(t) <= m) return 1ll * q * (t > 0 ? init_inv[t] : P - init_inv[-t]) % P;
}
return -1;
}
int main(){}
Details
implementer.cpp: In function ‘int main()’: implementer.cpp:22:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 22 | scanf("%d", &n); | ~~~~~^~~~~~~~~~ /usr/bin/ld: /tmp/ccUTwK5U.o: in function `main': answer.code:(.text.startup+0x0): multiple definition of `main'; /tmp/ccbHWqsU.o:implementer.cpp:(.text.startup+0x0): first defined here collect2: error: ld returned 1 exit status