这题可以用莫比乌斯反演来写,相关式子:
a
n
s
=
∑
i
=
1
n
−
1
∑
j
=
1
n
−
1
[
gcd
(
i
,
j
)
=
=
1
]
+
2
(
n
>
=
2
)
ans=\sum_{i=1}^{n-1}\sum_{j=1}^{n-1}[\gcd(i,j)==1]+2\quad(n >=2)
ans=∑i=1n−1∑j=1n−1[gcd(i,j)==1]+2(n>=2)
当
n
=
1
,
a
n
s
=
0
当n=1,ans=0
当n=1,ans=0
但我们不用反演去写,我们思考欧拉函数
欧拉函数
ϕ
(
n
)
=
n
∏
(
1
−
1
p
)
\phi(n)=n\prod(1-\frac{1}{p})
ϕ(n)=n∏(1−p1),p为n的质因数
用和式的写法:
ϕ
(
n
)
=
∑
i
=
1
n
[
gcd
(
i
,
n
)
=
=
1
]
\phi(n)=\sum_{i=1}^{n}[\gcd(i,n)==1]
ϕ(n)=∑i=1n[gcd(i,n)==1]
分析:
a
n
s
=
∑
i
=
1
n
−
1
∑
j
=
1
n
−
1
[
gcd
(
i
,
j
)
=
=
1
]
+
2
ans=\sum_{i=1}^{n-1}\sum_{j=1}^{n-1}[\gcd(i,j)==1]+2
ans=∑i=1n−1∑j=1n−1[gcd(i,j)==1]+2
a
n
s
=
∑
i
=
1
n
−
1
∑
j
=
1
i
[
gcd
(
i
,
j
)
=
=
1
]
+
∑
i
=
1
n
−
1
∑
j
=
i
n
−
1
[
gcd
(
i
,
j
)
=
=
1
]
+
1
ans=\sum_{i=1}^{n-1}\sum_{j=1}^{i}[\gcd(i,j)==1]+\sum_{i=1}^{n-1}\sum_{j=i}^{n-1}[\gcd(i,j)==1]+1
ans=∑i=1n−1∑j=1i[gcd(i,j)==1]+∑i=1n−1∑j=in−1[gcd(i,j)==1]+1
考虑欧拉函数:
a
n
s
=
2
∑
i
=
1
n
−
1
ϕ
(
i
)
+
1
(
n
>
=
2
)
ans=2\sum_{i=1}^{n-1}\phi(i)+1\quad(n>=2)
ans=2∑i=1n−1ϕ(i)+1(n>=2)
做完前缀和,查询是O(1)感觉比莫比乌斯还快
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template <typename T>
void out(T x) { cout << x << endl; }
const int N = 4e4 + 4;
ll fast_pow(ll a, ll b, ll p) {ll c = 1; while(b) { if(b & 1) c = c * a % p; a = a * a % p; b >>= 1;} return c;}
ll phi[N];
void get_phi()
{
memset(phi, 0, sizeof(phi));
phi[1] = 1;
for(int i = 2; i < N; i ++)
{
if(!phi[i])
for(int j = i; j < N; j += i)
{
if(!phi[j])
phi[j] = j;
phi[j] = phi[j] / i * (i - 1);
}
}
for(int i = 1; i < N; i ++)
phi[i] += phi[i - 1];
}
int main()
{
ios::sync_with_stdio(false);
get_phi();
int n;
cin >> n;
cout << (n != 1 ? 2 * phi[n - 1] + 1 : 0) << endl;
}