QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#167014#5. 在线 O(1) 逆元OneWan100 ✓1593ms24360kbC++201.0kb2023-09-06 22:51:242024-11-05 21:52:17

Judging History

你现在查看的是最新测评结果

  • [2024-11-05 21:52:17]
  • 管理员手动重测本题所有提交记录
  • 测评结果:100
  • 用时:1593ms
  • 内存:24360kb
  • [2023-09-06 22:51:25]
  • 评测
  • 测评结果:100
  • 用时:2430ms
  • 内存:24116kb
  • [2023-09-06 22:51:24]
  • 提交

answer

#include "inv.h"
#include <bits/stdc++.h>
using namespace std;

const int B = 1 << 10, T = 1 << 20;
struct Inverse {
	int mod;
	int f[T + 1], p[T + 1], buf[T * 3 + 3], *I = buf + T;
	Inverse(int mod) : mod(mod) {
		for (int i = 1 ; i <= B ; i++) {
			int s = 0, d = i << 10;
			for (int j = 1 ; j <= T ; j++) {
				if ((s += d) >= mod) s -= mod;
				if (s <= T) {
					if (f[j] == 0) {
						f[j] = i;
						p[j] = s;
					}
				} else if (s >= mod - T) {
					if (f[j] == 0) {
						f[j] = i;
						p[j] = s - mod;
					}
				} else {
					int t = (mod - 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 * (mod - mod / i) * I[mod % i] % mod;
		}
		for (int i = -1 ; i >= -T ; i--) {
			I[i] = mod - I[-i];
		}
	}
	int operator()(int x) {
		return 1LL * I[p[x >> 10] + (x & 1023) * f[x >> 10]] * f[x >> 10] % mod;
	}
}; // Inverse

void init(int p) {
	
}
Inverse invs(998244353);
int inv(int x) {
	return invs(x);
}

詳細信息


Pretests


Final Tests

Test #1:

score: 10
Accepted
time: 21ms
memory: 24236kb

Test #2:

score: 20
Accepted
time: 180ms
memory: 24180kb

Test #3:

score: 30
Accepted
time: 806ms
memory: 24360kb

Test #4:

score: 20
Accepted
time: 1281ms
memory: 24308kb

Test #5:

score: 20
Accepted
time: 1593ms
memory: 24360kb