定义
∀
a
,
b
∈
N
,
若
g
c
d
(
a
,
b
)
=
1
,
则称
a
,
b
互质
\forall a,b \in \mathbb{N},若gcd(a,b)=1,则称a,b互质
∀a,b∈N,若gcd(a,b)=1,则称a,b互质。
对于三个数或更多个数的情况,我们把
g
c
d
(
a
,
b
,
c
)
=
1
gcd(a,b,c)=1
gcd(a,b,c)=1的情况称为a,b,c互质。把
g
c
d
(
a
,
b
)
=
g
c
d
(
a
,
c
)
=
g
c
d
(
b
,
c
)
=
1
gcd(a,b)=gcd(a,c)=gcd(b,c)=1
gcd(a,b)=gcd(a,c)=gcd(b,c)=1称为a,b,c两两互质。后者显然是一个更强的条件。
欧拉函数
[1,N]中与N互质的数的个数被称为欧拉函数,记为
ϕ
(
N
)
\phi(N)
ϕ(N)。
若在算数基本定理中,
N
=
p
1
c
1
p
2
c
2
.
.
.
p
m
c
m
N=p_1^{c_1}p_2^{c_2}...p_m^{c_m}
N=p1c1p2c2...pmcm,则:
ϕ
(
N
)
=
N
∗
p
1
−
1
p
1
∗
p
2
−
1
p
2
∗
.
.
.
∗
p
m
−
1
p
m
=
N
∗
∏
质数
p
∣
N
(
1
−
1
p
)
\phi(N)=N*\frac{p_1-1}{p1}*\frac{p_2-1}{p2}*...*\frac{p_m-1}{pm}=N*\prod\limits_{质数p|N}(1-\frac{1}{p})
ϕ(N)=N∗p1p1−1∗p2p2−1∗...∗pmpm−1=N∗质数p∣N∏(1−p1)
证明:
设p是N的质因子,[1,N]中p的倍数有p,2p,3p,…,(N/p)*p,共N/p个。若q也是N的质因子,则[1,N]中q的倍数有N/q个。如果我们把这N/p+N/q个数去掉,那么p*q的倍数被去掉了两次,需要加一次回来。
因此[1,N]中不与N含有任何共同质因子p或q的数的个数为:
N
−
N
p
−
N
q
+
N
p
q
=
N
(
1
−
1
p
)
(
1
−
1
q
)
N-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq}=N(1-\frac{1}{p})(1-\frac{1}{q})
N−pN−qN+pqN=N(1−p1)(1−q1)
实际上这种思想叫做容斥原理,在N的全部质因子上使用容斥原理,可得到[1,N]中不与N含有任何公共质因子的数的个数,也就是与N互质的数的个数。
根据欧拉函数的计算式,我们只需要分解质因数,便可以顺便求出欧拉函数。
int phi(int n)
{
int ans = n;
for (int i = 2; i <= sqrt(n); i ++ )
if (n % i == 0){
ans = ans / i * (i - 1);
while (n % i == 0) n /= i;
}
if (n > 1) ans = ans / n * (n - 1);
return ans;
}
性质1-2
1.
∀
n
>
1
,
[
1
,
n
]
中与
n
互质的数的和为
n
∗
ϕ
(
n
)
/
2
\forall n > 1,[1,n]中与n互质的数的和为n*\phi(n)/2
∀n>1,[1,n]中与n互质的数的和为n∗ϕ(n)/2。
2.
若
a
,
b
互质
,
则
ϕ
(
a
b
)
=
ϕ
(
a
)
∗
ϕ
(
b
)
若a,b互质,则\phi(ab)=\phi(a)*\phi(b)
若a,b互质,则ϕ(ab)=ϕ(a)∗ϕ(b)。
证明:
因为
g
c
d
(
n
,
x
)
=
g
c
d
(
n
,
n
−
x
)
gcd(n,x)=gcd(n,n-x)
gcd(n,x)=gcd(n,n−x),所以与n不互质的数x,n-x成对出现,平均值为n/2,因此与n互质的数平均值也是n/2,可得性质1。
根据欧拉函数的计算式,对a,b分解质因数直接可得性质2。
积性函数
如果a,b互质,有
f
(
a
b
)
=
f
(
a
)
∗
f
(
b
)
f(ab)=f(a)*f(b)
f(ab)=f(a)∗f(b),那么称函数f为积性函数。
性质3-6
3.若f是积性函数,且在算术基本定理中
n
=
∏
i
=
1
m
p
i
c
i
n=\prod_{i=1}^{m}p_i^{c_i}
n=∏i=1mpici,则
f
(
n
)
=
∏
i
=
1
m
f
(
p
i
c
i
)
f(n)=\prod_{i=1}^{m}f(p_i^{c_i})
f(n)=∏i=1mf(pici)。
4.设p为质数,若
p
∣
n
p|n
p∣n且
p
2
∣
n
p^2|n
p2∣n,则
ϕ
(
n
)
=
ϕ
(
n
/
p
)
∗
p
。
\phi(n)=\phi(n/p)*p。
ϕ(n)=ϕ(n/p)∗p。
5.设p为质数,若
p
∣
n
p|n
p∣n且
p
2
!
∣
n
p^2!|n
p2!∣n,则
ϕ
(
n
)
=
ϕ
(
n
/
p
)
∗
(
p
−
1
)
。
\phi(n)=\phi(n/p)*(p-1)。
ϕ(n)=ϕ(n/p)∗(p−1)。
6.
∑
d
∣
n
ϕ
(
d
)
=
n
\sum_{d|n}\phi(d)=n
∑d∣nϕ(d)=n。
证明:
性质3显然。
若
p
∣
n
p|n
p∣n且
p
2
∣
n
p^2|n
p2∣n,则n,n|p包含相同的质因子,只是p的指数不同,把两者按照欧拉函数的计算公式写出,二者相除,商为p,所以性质4成立。
若
p
∣
n
p|n
p∣n且
p
2
!
∣
n
p^2!|n
p2!∣n则p,n|p互质,
ϕ
(
n
)
=
ϕ
(
n
/
p
)
∗
ϕ
(
p
)
\phi(n)=\phi(n/p)*\phi(p)
ϕ(n)=ϕ(n/p)∗ϕ(p),而
ϕ
(
p
)
=
p
−
1
\phi(p)=p-1
ϕ(p)=p−1,所以性质5成立。
利用线性筛求1到n所有数的欧拉函数
void init(int n)
{
phi[1] = 1;
for (int i = 2; i <= n; i ++ )
{
if (!st[i])
{
prime[cnt ++ ] = i;
phi[i] = i - 1;
}
for (int j = 0; prime[j] * i <= n; j ++ )
{
st[i * prime[j]] = 1;
if(i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j];//性质4
break;
}
phi[i * prime[j]] = phi[i] * (prime[j] - 1);//性质5
}
}
}
如果所有的点与原点的连接构成直线 y = a b x y=\frac{a}{b}x y=bax的话,本题要求的就是在1到n范围内互质的(a,b)的对数是多少,按照y=x分成上下两部分,本题的答案即为 2 ∗ ϕ ( n ) + 1 2*\phi(n)+1 2∗ϕ(n)+1。
#include <iostream>
using namespace std;
#define N 1010
bool st[N];
int prime[N];
int phi[N];
int cnt = 0;
void init(int n)
{
phi[1] = 1;
for (int i = 2; i <= n; i ++ )
{
if (!st[i])
{
prime[cnt ++ ] = i;
phi[i] = i - 1;
}
for (int j = 0; prime[j] * i <= n; j ++ )
{
st[i * prime[j]] = 1;
if(i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
int main()
{
init(N - 1);
int n, m;
cin >> m;
for (int T = 1; T <= m; T ++ )
{
int ans = 1;
cin >> n;
for (int k = 1; k <= n; k ++ ) ans += 2 * phi[k];
cout << T << ' ' << n << ' ' << ans << endl;
}
return 0;
}