Version 1
Description
-
多测, t t t 组数据。
-
给定整数 n n n,求
∑ i = 1 n ∑ j = i + 1 n gcd ( i , j ) \sum_{i = 1}^n \sum_{j = i + 1}^n \gcd(i, j) i=1∑nj=i+1∑ngcd(i,j) -
1 ≤ t ≤ 100 , 1 ≤ n ≤ 501 1\le t\le 100, 1\le n\le 501 1≤t≤100,1≤n≤501。
Solution
O ( n 2 ) \Omicron(n^2) O(n2) 暴力。
Code
略。
Version 2
UVA11426 拿行李(极限版) GCD - Extreme (II)
Description
-
多测, t t t 组数据。
-
给定整数 n n n,求
∑ i = 1 n ∑ j = i + 1 n gcd ( i , j ) \sum_{i = 1}^n \sum_{j = i +1}^n \gcd(i, j) i=1∑nj=i+1∑ngcd(i,j) -
1 ≤ t ≤ 2 × 1 0 4 , 1 ≤ n ≤ 4 × 1 0 6 1\le t\le 2\times 10^4, 1\le n\le 4\times 10^6 1≤t≤2×104,1≤n≤4×106。
Solution
∑ i = 1 n ∑ j = i + 1 n gcd ( i , j ) = ∑ i = 1 n ∑ j = 1 n gcd ( i , j ) − ∑ i = 1 n gcd ( i , i ) 2 = ∑ i = 1 n ∑ j = 1 n gcd ( i , j ) − ∑ i = 1 n i 2 \begin{aligned} \sum_{i = 1}^n \sum_{j = i + 1}^n \gcd(i, j) & = \dfrac{\sum\limits_{i = 1}^n \sum\limits_{j = 1}^n \gcd(i, j) - \sum\limits_{i = 1}^n \gcd(i, i)}{2} \\ & = \dfrac{\sum\limits_{i = 1}^n \sum\limits_{j = 1}^n \gcd(i, j) - \sum\limits_{i = 1}^n i}{2} \end{aligned} i=1∑nj=i+1∑ngcd(i,j)=2i=1∑nj=1∑ngcd(i,j)−i=1∑ngcd(i,i)=2i=1∑nj=1∑ngcd(i,j)−i=1∑ni
运用你丰富的莫反技巧,得到
∑
i
=
1
n
∑
j
=
1
n
gcd
(
i
,
j
)
=
∑
d
=
1
n
φ
(
d
)
⌊
n
d
⌋
2
\sum_{i = 1}^n \sum_{j = 1}^n \gcd(i, j) = \sum_{d = 1}^n \varphi(d) \left\lfloor\dfrac{n}{d}\right\rfloor^2
i=1∑nj=1∑ngcd(i,j)=d=1∑nφ(d)⌊dn⌋2
线性筛 + 整除分块。
时间复杂度为 O ( n + t n ) \Omicron(n + t \sqrt{n}) O(n+tn)。
会 T L E \rm TLE TLE。
换一种方法:
令
f
(
n
)
=
∑
i
=
1
n
gcd
(
i
,
n
)
f(n) = \sum_{i = 1}^n \gcd(i, n)
f(n)=∑i=1ngcd(i,n),那么
∑
i
=
1
n
∑
j
=
i
+
1
n
gcd
(
i
,
j
)
=
∑
j
=
1
n
∑
i
=
1
j
−
1
gcd
(
i
,
j
)
=
∑
i
=
1
n
∑
j
=
1
i
gcd
(
i
,
j
)
−
∑
i
=
1
n
i
=
∑
i
=
1
n
f
(
i
)
−
n
⋅
(
n
+
1
)
2
\begin{aligned} \sum_{i = 1}^n \sum_{j = i + 1}^n \gcd(i, j) & = \sum_{j = 1}^n \sum_{i = 1}^{j - 1} \gcd(i, j) \\ & = \sum_{i = 1}^n \sum_{j = 1}^i \gcd(i, j) - \sum_{i = 1}^n i \\ & = \sum_{i = 1}^n f(i) - \dfrac{n \cdot (n +1)}{2} \end{aligned}
i=1∑nj=i+1∑ngcd(i,j)=j=1∑ni=1∑j−1gcd(i,j)=i=1∑nj=1∑igcd(i,j)−i=1∑ni=i=1∑nf(i)−2n⋅(n+1)
又有
f
(
n
)
=
∑
i
=
1
n
gcd
(
i
,
n
)
=
∑
d
∣
n
∑
i
=
1
n
d
[
gcd
(
i
,
n
)
=
d
]
=
∑
d
∣
n
d
∑
i
=
1
n
d
[
gcd
(
i
,
n
d
)
=
1
]
=
∑
d
∣
n
d
⋅
φ
(
n
d
)
=
∑
d
∣
n
φ
(
d
)
⋅
n
d
=
(
φ
∗
Id
)
(
n
)
\begin{aligned} f(n) & = \sum_{i = 1}^n \gcd(i, n) \\ & = \sum_{d \mid n} \sum_{i = 1}^n d[\gcd(i, n) = d] \\ & = \sum_{d \mid n} d \sum_{i = 1}^{\frac{n}{d}} \left[\gcd\left(i, \dfrac{n}{d} \right) = 1 \right] \\ & = \sum_{d \mid n} d \cdot \varphi\left(\dfrac{n}{d} \right) \\ & = \sum_{d \mid n} \varphi(d) \cdot \dfrac{n}{d} \\ & = (\varphi * \operatorname{Id})(n) \end{aligned}
f(n)=i=1∑ngcd(i,n)=d∣n∑i=1∑nd[gcd(i,n)=d]=d∣n∑di=1∑dn[gcd(i,dn)=1]=d∣n∑d⋅φ(dn)=d∣n∑φ(d)⋅dn=(φ∗Id)(n)
由于
φ
,
Id
\varphi, \operatorname{Id}
φ,Id 均为积性函数,因此
f
f
f 也为积性函数,可以线性筛(当然你可以
Θ
(
n
ln
n
)
\Theta(n\ln n)
Θ(nlnn) 算但是这不够好
将 n n n 分解质因数: n = ∏ i = 1 k p i α i n = \prod_{i = 1}^k p_i^{\alpha_i} n=∏i=1kpiαi,记录 β ( n ) = α 1 , γ ( n ) = p 1 α 1 \beta(n) = \alpha_1, \gamma(n) = p_1^{\alpha_1} β(n)=α1,γ(n)=p1α1。
-
i ∈ P i\in \mathbb{P} i∈P: f ( i ) = i + ( i − 1 ) = 2 i − 1 , β ( i ) = 1 , γ ( i ) = i f(i) = i + (i - 1) = 2i - 1, \beta(i) = 1, \gamma(i) = i f(i)=i+(i−1)=2i−1,β(i)=1,γ(i)=i
-
p j ∤ i p_j\nmid i pj∤i: f ( i ⋅ p j ) = f ( i ) ⋅ f ( p j ) , β ( i ⋅ p j ) = 1 , γ ( i ⋅ p j ) = p j f(i\cdot p_j) = f(i)\cdot f(p_j), \beta(i\cdot p_j) = 1, \gamma(i\cdot p_j) = p_j f(i⋅pj)=f(i)⋅f(pj),β(i⋅pj)=1,γ(i⋅pj)=pj
-
p j ∣ i p_j\mid i pj∣i: β ( i ⋅ p j ) = β ( i ) + 1 , γ ( i ⋅ p j ) = γ ( i ) ⋅ p j \beta(i\cdot p_j) = \beta(i) + 1, \gamma(i\cdot p_j) = \gamma(i) \cdot p_j β(i⋅pj)=β(i)+1,γ(i⋅pj)=γ(i)⋅pj
-
γ ( i ) = i \gamma(i) = i γ(i)=i,即 i ⋅ p j = p k ( p ∈ P ) i\cdot p_j = p^k(p\in \mathbb{P}) i⋅pj=pk(p∈P),其中 k = β ( i ⋅ p j ) k = \beta(i \cdot p_j) k=β(i⋅pj),暴力算
f ( p k ) = φ ( 1 ) ⋅ p k 1 + ∑ d ∣ p k , d > 1 φ ( d ) ⋅ p k d = p k ⋅ ∑ i = 1 k [ p i − 1 ( p − 1 ) ] ⋅ p k − i = p k ⋅ ∑ i = 1 k ( p i − p i − 1 ) ⋅ p k − i = p k ⋅ ∑ i = 1 k p k − p k − 1 = ( k + 1 ) p k − k ⋅ p k − 1 = [ β ( i ⋅ p j ) + 1 ] ( i ⋅ p j ) − β ( i ⋅ p j ) ⋅ i \begin{aligned} f(p^k) & = \varphi(1) \cdot \dfrac{p^k}{1} + \sum_{d\mid p^k, d > 1} \varphi(d) \cdot \dfrac{p^k}{d} \\ & = p^k \cdot \sum_{i = 1}^k [p^{i - 1}(p - 1)] \cdot p^{k - i} \\ & = p^k \cdot \sum_{i = 1}^k (p^i - p^{i - 1}) \cdot p^{k - i} \\ & = p^k \cdot \sum_{i = 1}^k p^k - p^{k - 1} \\ & = (k + 1) p^k - k \cdot p^{k - 1} \\ & = [\beta(i\cdot p_j) + 1](i\cdot p_j) - \beta(i\cdot p_j)\cdot i \end{aligned} f(pk)=φ(1)⋅1pk+d∣pk,d>1∑φ(d)⋅dpk=pk⋅i=1∑k[pi−1(p−1)]⋅pk−i=pk⋅i=1∑k(pi−pi−1)⋅pk−i=pk⋅i=1∑kpk−pk−1=(k+1)pk−k⋅pk−1=[β(i⋅pj)+1](i⋅pj)−β(i⋅pj)⋅i -
γ ( i ) ≠ i \gamma(i) \ne i γ(i)=i,此时 p j p_j pj 是 i i i 的最小质因数。
f ( i ⋅ p j ) = f { i γ ( i ) ⋅ [ p j ⋅ γ ( i ) ] } f(i \cdot p_j) = f\left\{\dfrac{i}{\gamma(i)} \cdot [p_j \cdot \gamma(i)] \right\} f(i⋅pj)=f{γ(i)i⋅[pj⋅γ(i)]}
此时 i i i 的所有质因数 p j p_j pj 都被除掉了, gcd [ i γ ( i ) , p j ⋅ γ ( i ) ] = 1 \gcd\left[\dfrac{i}{\gamma(i)}, p_j \cdot \gamma(i) \right] = 1 gcd[γ(i)i,pj⋅γ(i)]=1,由 f f f 是积性函数有
f ( i ⋅ p j ) = f { i γ ( i ) ⋅ [ p j ⋅ γ ( i ) ] } = f [ i γ ( i ) ] ⋅ f [ p j ⋅ γ ( i ) ] f(i \cdot p_j) = f\left\{\dfrac{i}{\gamma(i)} \cdot [p_j \cdot \gamma(i)] \right\} = f\left[\dfrac{i}{\gamma(i)} \right] \cdot f[p_j \cdot \gamma(i)] f(i⋅pj)=f{γ(i)i⋅[pj⋅γ(i)]}=f[γ(i)i]⋅f[pj⋅γ(i)]
-
综上,预处理 O ( n ) \Omicron(n) O(n),询问 Θ ( 1 ) \Theta(1) Θ(1),总时间复杂度为 O ( n + t ) \Omicron(n + t) O(n+t)。
Code
// 18 = 9 + 9 = 18.
#include <iostream>
#include <cstdio>
#define Debug(x) cout << #x << "=" << x << endl
typedef long long ll;
using namespace std;
const int MAXN = 1e6 + 5;
const int N = 1e6;
int p[MAXN], beta[MAXN], gamma[MAXN];
ll f[MAXN], sum[MAXN];
bool vis[MAXN];
void pre()
{
f[1] = 1;
for (int i = 2; i <= N; i++)
{
if (!vis[i])
{
p[++p[0]] = i;
f[i] = 2 * i - 1;
beta[i] = 1;
gamma[i] = i;
}
for (int j = 1; j <= p[0] && i * p[j] <= N; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
beta[i * p[j]] = beta[i] + 1;
gamma[i * p[j]] = gamma[i] * p[j];
if (gamma[i] == i)
{
f[i * p[j]] = (ll)(beta[i * p[j]] + 1) * (i * p[j]) - beta[i * p[j]] * i;
}
else
{
f[i * p[j]] = f[i / gamma[i]] * f[p[j] * gamma[i]];
}
break;
}
f[i * p[j]] = f[i] * f[p[j]];
beta[i * p[j]] = 1;
gamma[i * p[j]] = p[j];
}
}
for (int i = 1; i <= N; i++)
{
sum[i] = sum[i - 1] + f[i];
}
}
int main()
{
pre();
int n;
while (scanf("%d", &n), n)
{
printf("%lld\n", sum[n] - (ll)n * (n + 1) / 2);
}
return 0;
}
Version 3
SP26045 GCDMAT2 - GCD OF MATRIX (hard)
Description
-
多测, t t t 组数据。
-
给定正整数 i 1 , i 2 , j 1 , j 2 i1, i2, j1, j2 i1,i2,j1,j2,求
[ ∑ i = i 1 i 2 ∑ j = j 1 j 2 gcd ( i , j ) ] m o d ( 1 0 9 + 7 ) \begin{aligned} \left[\sum_{i = i1}^{i2} \sum_{j = j1}^{j2} \gcd(i, j) \right] \bmod (10^9 +7) \end{aligned} [i=i1∑i2j=j1∑j2gcd(i,j)]mod(109+7) -
t ≤ 5 × 1 0 4 , max { i 2 } , max { j 2 } ≤ 1 0 6 t\le 5\times 10^4, \max\{i2\}, \max\{j2\} \le 10^6 t≤5×104,max{i2},max{j2}≤106。
Solution
容斥。
设
(不妨设
n
≤
m
)
f
(
n
,
m
)
=
∑
i
=
1
n
∑
j
=
1
m
gcd
(
i
,
j
)
=
∑
i
=
1
n
φ
(
i
)
⌊
n
i
⌋
⌊
m
i
⌋
\textsf{(不妨设 } n \le m \textsf{)} \begin{aligned} f(n, m) & = \sum_{i = 1}^n \sum_{j = 1}^m \gcd(i, j) \\ & = \sum_{i = 1}^n \varphi(i) \left\lfloor\dfrac{n}{i}\right\rfloor \left\lfloor\dfrac{m}{i}\right\rfloor \end{aligned}
(不妨设 n≤m)f(n,m)=i=1∑nj=1∑mgcd(i,j)=i=1∑nφ(i)⌊in⌋⌊im⌋
则
a
n
s
=
f
(
i
2
,
j
2
)
−
f
(
i
2
,
j
1
−
1
)
−
f
(
i
1
−
1
,
j
2
)
+
f
(
i
1
−
1
,
j
1
−
1
)
ans = f(i2, j2) - f(i2, j1 - 1) - f(i1 - 1, j2) + f(i1 - 1, j1 - 1)
ans=f(i2,j2)−f(i2,j1−1)−f(i1−1,j2)+f(i1−1,j1−1)
时间复杂度为
O
(
n
+
t
n
)
\Omicron(n + t\sqrt{n})
O(n+tn)。
你算了算 1 0 6 + 5 × 1 0 4 × 2 1 0 6 ≈ 1 0 8 10^6 + 5\times 10^4 \times 2\sqrt{10^6} \approx 10^8 106+5×104×2106≈108,而时限 2.5 s 2.5s 2.5s,好像能过。
问题来了,你的整除分块做除法至少有 4 4 4 倍常数,而一次容斥又要做 4 4 4 次整除分块,总共是 16 16 16 倍大常数。
1 0 6 + 5 × 1 0 4 × 2 1 0 6 × 16 ≈ 1.6 × 1 0 9 10^6 + 5\times 10^4 \times 2\sqrt{10^6} \times 16 \approx 1.6\times 10^9 106+5×104×2106×16≈1.6×109。
额,终于知道为什么评黑了。
开始卡常。
-
Step 1 \text{Step } 1 Step 1:不用容斥,直接算
a n s = ∑ i = 1 min ( i 2 , j 2 ) φ ( i ) ( ⌊ i 2 i ⌋ − ⌊ i 1 − 1 i ⌋ ) ( ⌊ j 2 i ⌋ − ⌊ j 1 − 1 i ⌋ ) ans = \sum_{i = 1}^{\min(i2, j2)} \varphi(i) \left(\left\lfloor\dfrac{i2}{i}\right\rfloor - \left\lfloor\dfrac{i1 - 1}{i}\right\rfloor \right) \left(\left\lfloor\dfrac{j2}{i}\right\rfloor - \left\lfloor\dfrac{j1 - 1}{i}\right\rfloor \right) ans=i=1∑min(i2,j2)φ(i)(⌊ii2⌋−⌊ii1−1⌋)(⌊ij2⌋−⌊ij1−1⌋)
这样整除分块变成 8 8 8 倍常数,但只用算一次。 -
Step 2 \text{Step } 2 Step 2:预处理 1 ∼ 1 0 6 1\sim 10^6 1∼106 的倒数,用
double
存应该够了。乘法比除法快。 -
Step 3 \text{Step } 3 Step 3:根号分治。
Code
代码中有一步 inv[i] = (1.0 / i) * EXP
,其中
E
X
P
=
1
0
−
10
EXP = 10^{-10}
EXP=10−10。
原因是像 i = 3 i = 3 i=3 这样的会得到 i n v [ 3 ] = 0.333 ⋯ inv[3] = 0.333\cdots inv[3]=0.333⋯,然后 3 × i n v [ 3 ] = 0.999 ⋯ 3 \times inv[3] = 0.999\cdots 3×inv[3]=0.999⋯,下取整成了 0 0 0,所以要乘上 E X P EXP EXP 防止精度误差。
//18 = 9 + 9 = 18.
#pragma GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <bitset>
#include <cmath>
#define Debug(x) cout << #x << "=" << x << endl
typedef long long ll;
using namespace std;
#define re register
#define il inline
namespace Fread
{
}
using Fread::read;
namespace Fwrite
{
}
using Fwrite::write;
const int MAXN = 1e6 + 5;
const int MOD = 1e9 + 7;
const double EXP = 1 + 1e-10;
int p[MAXN / 10], phi[MAXN], sum[MAXN];
bitset<MAXN> vis;
double inv[MAXN];
void pre(int n)
{
phi[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p[++p[0]] = i;
phi[i] = i - 1;
}
for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
phi[i * p[j]] = phi[i] * p[j];
break;
}
phi[i * p[j]] = phi[i] * phi[p[j]];
}
}
for (int i = 1; i <= n; i++)
{
sum[i] = (sum[i - 1] + phi[i]) % MOD;
}
for (int i = 1; i <= n; i++)
{
inv[i] = (1.0 / i) * EXP;
}
}
il int GetSum(int l, int r)
{
return (sum[r] - sum[l - 1] + MOD) % MOD;
}
il int min2(int x, int y)
{
return x < y ? x : y;
}
il int div2(int a, int b)
{
if (b)
{
return (int)a * inv[b];
}
return 0x3f3f3f3f;
}
il void swap2(int &x, int &y)
{
x ^= y ^= x ^= y;
}
int block(int i1, int i2, int j1, int j2)
{
i1--, j1--;
if (i2 > j2)
{
swap2(i1, j1);
swap2(i2, j2);
}
int mid = sqrt(i2), res = 0;
for (int i = 1; i <= mid; i++)
{
res = (res + (ll)phi[i] * (div2(i2, i) - div2(i1, i)) % MOD * (div2(j2, i) - div2(j1, i)) % MOD) % MOD;
}
for (int l = mid + 1, r; l <= i2; l = r + 1)
{
int k1 = div2(i1, l), k2 = div2(i2, l), k3 = div2(j1, l), k4 = div2(j2, l);
r = min2(div2(i1, k1), min2(div2(i2, k2), min2(div2(j1, k3), div2(j2, k4))));
res = (res + (ll)GetSum(l, r) * (k2 - k1) % MOD * (k4 - k3) % MOD) % MOD;
}
return res;
}
int main()
{
int t = read(), n = read(), m = read();
pre(max(n, m));
while (t--)
{
int i1 = read(), j1 = read(), i2 = read(), j2 = read();
write(block(i1, i2, j1, j2), '\n');
}
return 0;
}
Version4
SP19985 GCDEX2 - GCD Extreme (hard)
Description
-
多测, t t t 组数据。
-
给定整数 n n n,求出
[ ∑ i = 1 n ∑ j = i + 1 n gcd ( i , j ) ] m o d 2 64 \left[\sum_{i = 1}^n \sum_{j = i + 1}^n \gcd(i, j) \right] \bmod 2^{64} [i=1∑nj=i+1∑ngcd(i,j)]mod264 -
t ≤ 1 0 4 t\le 10^4 t≤104, 1 ≤ n ≤ 235711131719 ≈ 2 × 1 0 11 1\le n\le 235711131719 \approx 2\times 10^{11} 1≤n≤235711131719≈2×1011。
Solution
首先 m o d 2 64 \bmod 2^{64} mod264 就是开 unsigned long long \text{unsigned long long} unsigned long long 然后自然溢出。
Version 2 的方法要 O ( n ) \Omicron(n) O(n) 预处理,会废。
试着枚举
gcd
\gcd
gcd:
a
n
s
=
∑
j
=
1
n
∑
i
=
1
j
−
1
gcd
(
i
,
j
)
=
∑
i
=
1
n
∑
j
=
1
i
gcd
(
i
,
j
)
−
∑
i
=
1
n
i
=
∑
d
=
1
n
∑
i
=
1
n
∑
j
=
1
i
d
[
gcd
(
i
,
j
)
=
d
]
−
∑
i
=
1
n
i
=
∑
d
=
1
n
d
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
i
[
gcd
(
i
,
j
)
=
1
]
−
∑
i
=
1
n
i
=
∑
d
=
1
n
d
∑
i
=
1
⌊
n
d
⌋
φ
(
i
)
−
∑
i
=
1
n
i
\begin{aligned} ans & = \sum_{j = 1}^n \sum_{i = 1}^{j - 1} \gcd(i, j) \\ & = \sum_{i = 1}^n \sum_{j = 1}^i \gcd(i, j) - \sum_{i = 1}^n i \\ & = \sum_{d = 1}^n \sum_{i = 1}^n \sum_{j = 1}^i d [\gcd(i, j) = d] -\sum_{i = 1}^n i \\ & = \sum_{d = 1}^n d \sum_{i = 1}^{\left\lfloor\frac{n}{d}\right\rfloor} \sum_{j = 1}^i [\gcd(i, j) = 1] - \sum_{i = 1}^n i \\ & = \sum_{d = 1}^n d \sum_{i = 1}^{\left\lfloor\frac{n}{d}\right\rfloor} \varphi(i) - \sum_{i = 1}^n i \end{aligned}
ans=j=1∑ni=1∑j−1gcd(i,j)=i=1∑nj=1∑igcd(i,j)−i=1∑ni=d=1∑ni=1∑nj=1∑id[gcd(i,j)=d]−i=1∑ni=d=1∑ndi=1∑⌊dn⌋j=1∑i[gcd(i,j)=1]−i=1∑ni=d=1∑ndi=1∑⌊dn⌋φ(i)−i=1∑ni
前面一项把杜教筛扔到整除分块里就
O
(
n
2
3
+
n
)
≃
O
(
n
2
3
)
\Omicron(n^{\frac{2}{3}} + \sqrt{n}) \simeq \Omicron(n^{\frac{2}{3}})
O(n32+n)≃O(n32) 做完了。
别紧张时限有 20 s 20s 20s。
注意在 Version 2 中不要用杜教筛因为 n n n 太小然后杜教筛常数太大。
Code
// 18 = 9 + 9 = 18.
#include <iostream>
#include <cstdio>
#include <unordered_map>
#define Debug(x) cout << #x << "=" << x << endl
#define int unsigned long long
using namespace std;
const int MAXN = 21544346 + 5;
const int N = 21544346;
int p[MAXN], phi[MAXN], sum[MAXN];
bool vis[MAXN];
void pre()
{
phi[1] = sum[1] = 1;
for (int i = 2; i <= N; i++)
{
if (!vis[i])
{
p[++p[0]] = i;
phi[i] = i - 1;
}
sum[i] = sum[i - 1] + phi[i];
for (int j = 1; j <= p[0] && i * p[j] <= N; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
phi[i * p[j]] = phi[i] * p[j];
break;
}
phi[i * p[j]] = phi[i] * phi[p[j]];
}
}
}
int S(int n)
{
if (n % 2 == 0)
{
return n / 2 * (n + 1);
}
return (n + 1) / 2 * n;
}
unordered_map<int, int> dp;
int sublinear(int n)
{
if (n <= N)
{
return sum[n];
}
if (dp.count(n))
{
return dp[n];
}
int res = S(n);
for (int l = 2, r; l <= n; l = r + 1)
{
int k = n / l;
r = n / k;
res -= (r - l + 1) * sublinear(k);
}
return dp[n] = res;
}
int GetSum(int l, int r)
{
return S(r) - S(l - 1);
}
int block(int n)
{
int res = 0;
for (int l = 1, r; l <= n; l = r + 1)
{
int k = n / l;
r = n / k;
res += GetSum(l, r) * sublinear(k);
}
return res;
}
signed main()
{
pre();
int t;
scanf("%llu", &t);
while (t--)
{
int n;
scanf("%llu", &n);
printf("%llu\n", block(n) - S(n));
}
return 0;
}