QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#203353#5. 在线 O(1) 逆元_LAP_Compile Error//C++141.8kb2023-10-06 16:53:202024-11-05 21:41:38

Judging History

你现在查看的是测评时间为 2024-11-05 21:41:38 的历史记录

  • [2024-11-05 21:52:46]
  • 管理员手动重测本题所有提交记录
  • [2024-11-05 21:41:38]
  • 管理员手动重测本题所有提交记录
  • [2023-10-06 16:55:20]
  • 评测
  • [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(){}

詳細信息

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/cchsMHWe.o: in function `main':
answer.code:(.text.startup+0x0): multiple definition of `main'; /tmp/cczYdysf.o:implementer.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status