QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#299291#5. 在线 O(1) 逆元xhgua100 ✓3262ms24356kbC++141.0kb2024-01-06 18:34:292024-11-05 21:57:28

Judging History

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

  • [2024-11-05 21:57:28]
  • 管理员手动重测本题所有提交记录
  • 测评结果:100
  • 用时:3262ms
  • 内存:24356kb
  • [2024-01-06 18:34:29]
  • 评测
  • 测评结果:100
  • 用时:2824ms
  • 内存:24108kb
  • [2024-01-06 18:34:29]
  • 提交

answer

#include "inv.h"
#include <array>
#include <vector>
#include <iostream>

using i64 = long long;

constexpr int P = 998244353;

namespace Inversion {

	static constexpr int B = (1 << 10), T = (1 << 20);

	std::array<int, T + 1> f, p;
	std::array<int, T * 3 + 3> buf;

	int *I = buf.begin() + T;

	void init() {
		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;
	}
};

void init(int p) {
	Inversion::init();
}

int inv(int x) {
	return Inversion::inv(x);
}

Details


Pretests


Final Tests

Test #1:

score: 10
Accepted
time: 19ms
memory: 24148kb

Test #2:

score: 20
Accepted
time: 335ms
memory: 24172kb

Test #3:

score: 30
Accepted
time: 1466ms
memory: 24356kb

Test #4:

score: 20
Accepted
time: 2557ms
memory: 24284kb

Test #5:

score: 20
Accepted
time: 3262ms
memory: 24284kb