update
This commit is contained in:
parent
23cf754c28
commit
3f00df79e3
@ -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';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user