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;
}