This commit is contained in:
Zengtudor 2025-07-16 13:15:28 +08:00
parent 23cf754c28
commit 3f00df79e3

View File

@ -4,30 +4,30 @@
#include <unordered_map> #include <unordered_map>
using namespace std; using namespace std;
const int maxn = 1000000; const long maxn = 1000000;
int phi[maxn + 10]; long phi[maxn + 10];
int gvt[maxn + 10]; long gvt[maxn + 10];
int f_temp[maxn + 10]; long f_temp[maxn + 10];
int S1[maxn + 10]; long S1[maxn + 10];
int F[maxn + 10]; long F[maxn + 10];
int G_pre[maxn + 10]; long G_pre[maxn + 10];
int g_val[maxn + 10]; long g_val[maxn + 10];
bool ispsf[maxn + 10]; bool ispsf[maxn + 10];
int prF[maxn + 10], cnt_sieveF = 0; long prF[maxn + 10], cnt_sieveF = 0;
unordered_map<int, int> cache; unordered_map<long, long> cache;
void init_phi() { void init_phi() {
for (int i = 1; i <= maxn; i++) phi[i] = i; for (long i = 1; i <= maxn; i++) phi[i] = i;
for (int i = 2; i <= maxn; i++) { for (long i = 2; i <= maxn; i++) {
if (phi[i] == i) { if (phi[i] == i) {
for (int j = i; j <= maxn; j += i) { for (long j = i; j <= maxn; j += i) {
phi[j] = phi[j] / i * (i - 1); phi[j] = phi[j] / i * (i - 1);
} }
} }
@ -36,21 +36,21 @@ void init_phi() {
void init_F() { void init_F() {
for (int i = 1; i <= maxn; i++) { for (long i = 1; i <= maxn; i++) {
ispsf[i] = true; ispsf[i] = true;
} }
ispsf[1] = false; ispsf[1] = false;
F[1] = 1; F[1] = 1;
g_val[1] = 1; g_val[1] = 1;
for (int i = 2; i <= maxn; i++) { for (long i = 2; i <= maxn; i++) {
if (ispsf[i]) { if (ispsf[i]) {
prF[cnt_sieveF++] = i; prF[cnt_sieveF++] = i;
F[i] = i + 1; F[i] = i + 1;
g_val[i] = i + 1; g_val[i] = i + 1;
} }
for (int j = 0; j < cnt_sieveF; j++) { for (long j = 0; j < cnt_sieveF; j++) {
int p = prF[j]; long p = prF[j];
int num = 1LL * i * p; long num = 1LL * i * p;
if (num > maxn) break; if (num > maxn) break;
ispsf[num] = false; ispsf[num] = false;
if (i % p == 0) { if (i % p == 0) {
@ -64,13 +64,13 @@ void init_F() {
} }
} }
G_pre[0] = 0; G_pre[0] = 0;
for (int i = 1; i <= maxn; i++) { for (long i = 1; i <= maxn; i++) {
G_pre[i] = G_pre[i - 1] + F[i]; G_pre[i] = G_pre[i - 1] + F[i];
} }
} }
int getG(int n) { long getG(long n) {
if (n <= 0) return 0; if (n <= 0) return 0;
if (n <= maxn) { if (n <= maxn) {
return G_pre[n]; return G_pre[n];
@ -78,13 +78,13 @@ int getG(int n) {
if (cache.find(n) != cache.end()) { if (cache.find(n) != cache.end()) {
return cache[n]; return cache[n];
} }
int ans = 0; long ans = 0;
int l = 1, r; long l = 1, r;
for (; l <= n; l = r + 1) { for (; l <= n; l = r + 1) {
int k = n / l; long k = n / l;
r = n / k; r = n / k;
int sum_i = (int)(l + r) * (r - l + 1) / 2; long sum_i = (long)(l + r) * (r - l + 1) / 2;
ans += (int)k * sum_i; ans += (long)k * sum_i;
} }
cache[n] = ans; cache[n] = ans;
return ans; return ans;
@ -96,49 +96,49 @@ int main() {
init_phi(); init_phi();
for (int i = 1; i <= maxn; i++) { for (long i = 1; i <= maxn; i++) {
if (i == 1) { if (i == 1) {
gvt[i] = 1; gvt[i] = 1;
} else { } else {
gvt[i] = (int)i * phi[i] / 2; gvt[i] = (long)i * phi[i] / 2;
} }
} }
for (int d = 1; d <= maxn; d++) { for (long d = 1; d <= maxn; d++) {
for (int j = d; j <= maxn; j += d) { for (long j = d; j <= maxn; j += d) {
f_temp[j] += gvt[d]; f_temp[j] += gvt[d];
} }
} }
for (int i = 1; i <= maxn; i++) { for (long i = 1; i <= maxn; i++) {
S1[i] = (int)i * f_temp[i]; S1[i] = (long)i * f_temp[i];
} }
init_F(); init_F();
vector<int> fib; vector<long> fib;
fib.push_back(1); fib.push_back(1);
fib.push_back(1); fib.push_back(1);
while (fib.back() < 100000) { while (fib.back() < 100000) {
int next_fib = fib[fib.size() - 1] + fib[fib.size() - 2]; long next_fib = fib[fib.size() - 1] + fib[fib.size() - 2];
fib.push_back(next_fib); fib.push_back(next_fib);
} }
int t; long t;
cin >> t; cin >> t;
vector<pair<int, int>> que(t); vector<pair<long, long>> que(t);
for (int i = 0; i < t; i++) { for (long i = 0; i < t; i++) {
cin >> que[i].first >> que[i].second; cin >> que[i].first >> que[i].second;
} }
vector<int> type(t, 0); vector<long> type(t, 0);
int cur = 0; long cur = 0;
int fibidx = 0; long fibidx = 0;
while (cur < t) { while (cur < t) {
int num1 = fib[fibidx]; long num1 = fib[fibidx];
int end1 = min(cur + num1, t); long end1 = min(cur + num1, t);
for (int i = cur; i < end1; i++) { for (long i = cur; i < end1; i++) {
type[i] = 1; type[i] = 1;
} }
cur = end1; cur = end1;
@ -150,15 +150,15 @@ int main() {
} }
for (int i = 0; i < t; i++) { for (long i = 0; i < t; i++) {
int x = que[i].first; long x = que[i].first;
int y = que[i].second; long y = que[i].second;
if (type[i] == 1) { if (type[i] == 1) {
int ans = S1[y] - S1[x]; long ans = S1[y] - S1[x];
cout << ans << '\n'; cout << ans << '\n';
} else { } else {
int res = getG(y) - getG(x - 1); long res = getG(y) - getG(x - 1);
int ans = (int)res; long ans = (long)res;
cout << ans << '\n'; cout << ans << '\n';
} }
} }