NTT求调
查看原帖
NTT求调
1073459
封禁用户楼主2024/2/27 21:04

RT,TLE在第二十二个点了。 代码:

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

#define int long long
#define endl '\n' 

const int N = 4e5, M = 2e6 + 1e5;
//const int N = 20, M = 20 + 1e5;
const int mod = 998244353;
const int G = 3, Gi = 332748118;

int n, l, r;
int a[M+5], b[M+5], re[M+5];
int p[N+5];

bool vis[N+5];

int mpow(int a, int b) {
	int s = 1;
	while (b) {
		if (b & 1) s = s * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return s;
}

void NTT(int lim, int *a, int p) {
	for (int i = 0; i < lim; ++i)
		if (i < re[i]) swap(a[i], a[re[i]]);
	for (int mid = 1; mid < lim; mid <<= 1) {
		int wn = mpow(p > 0 ? G : Gi, (mod - 1) / (mid << 1));
		for (int i = 0; i < lim; i += (mid << 1)) {
			int w = 1;
			for (int j = 0; j < mid; ++j, w = w * wn % mod) {
				int x = a[i + j], y = w * a[i + j + mid] % mod;
				a[i + j] = (x + y) % mod, a[i + j + mid] = (x - y + mod) % mod;
			}
		}
	}
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	cin >> n >> l >> r; int ans = r - l + 1;
	for (int i = 1; i <= n; ++i) {
		cin >> p[i];
		a[p[i]] = b[N - p[i]] = 1;
	}
	sort(p + 1, p + 1 + n);
	for (int i = 1; i < n; ++i) {
		if (p[i] == p[i + 1]) {
			cout << "0\n";
			return 0;
		}
	}
	int lim = 1, cnt = 0; while (lim <= 2 * N) lim <<= 1, ++cnt;
	for (int i = 0; i <= lim; ++i)
		re[i] = (re[i >> 1] >> 1) | ((i & 1) << (cnt - 1));
	NTT(lim, a, 1), NTT(lim, b, 1);
	for (int i = 0; i <= lim; ++i) a[i] = a[i] * b[i] % mod;
	NTT(lim, a, -1);
	int inv = mpow(lim, mod - 2);
	for (int i = 0; i <= lim; ++i) a[i] = a[i] * inv % mod;
	for (int i = 1; i <= N; ++i) {
		if (!a[i + N]) continue;
		for (int j = 1; j * j <= i; ++j) {
			if (i % j == 0) {
				if (l <= j && j <= r && !vis[j]) {
					vis[j] = 1;
					--ans;
				}
				if (i / j != j)
					if (l <= i / j && i / j <= r && !vis[i / j]) {
						vis[i / j] = 1;
						--ans;
					}
			}
		}
	}
	cout << ans << "\n";
	return 0;
}
2024/2/27 21:04
加载中...