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