互质与欧拉函数学习笔记
互质
定义:
(forall a,bin N) ,若 (gcd(a,b)=1) ,则称 (a,b) 互质。
积性函数
定义:
如果 (a,b) 互质时,有 (f(ab)=f(a)*f(b)) ,那么称函数 (f) 为积性函数。
性质:
若 (f) 为积性函数,且在算数基本定理中, (n=prodlimits_{i=1}^m p_i^{c_i}) ,则 (f(n)=prodlimits_{i=1}^m f(p_i^{c_i})) 。
欧拉函数
- 定义:
(1sim N) 中与 (N) 互质的数的个数被称为欧拉函数,记为 (varphi(N)) 。
若在算数基本定理中, (N=p_1^{c_1}p_2^{c_2}cdots p_m^{c_m}) ,则: (varphi(N)=N*frac{p_1-1}{p_1}*frac{p_2-1}{p_2}cdotsfrac{p_m-1}{p_m}=N*prodlimits_{质数pmid N}(1-frac{1}{p})) 。
证明:
设 (p) 是 (N) 的质因子, (1sim N) 中 (p) 的倍数共有 (N/p) 个。同理,若 (q) 也是 (N) 的质因数,则 (1sim N) 中 (q) 的倍数有 (N/q) 个。若我们将这 (N/p+N/q) 个数去掉,那么 (p*q) 的倍数被排除了两次,需要加回来一个。因此,根据容斥原理, (1sim N) 中不与 (N) 含公共质因子 (p) 或 (q) 的数的个数为:
(N-frac{N}{p}-frac{N}{q}+frac{N}{pq}=N(1-frac{1}{p})(1-frac{1}{q}))
类似的,我们对于 (N) 的全部质因子使用容斥原理,即可得到 (varphi(N)) 。
- 性质
- (forall n>1,1sim n) 中与 (n) 互质的数之和为 (n*varphi(n)/2) 。
- 若 (a,b) 互质,则 (varphi(ab)=varphi(a)varphi(b)) 。
- 设 (p) 为质数,若 (pmid n) 且 (p^2mid n) ,则 (varphi(n)=varphi(n/p)*p) 。
- 设 (p) 为质数,若 (pmid n) 且 (p^2 ot|n) ,则 (varphi(n)=varphi(n/p)*(p-1)) 。
- (sumlimits_{d|n}varphi(d)=n) 。
证明:
因为 (gcd(n,x)=gcd(n,n-x)) ,所以与 (n) 不互质的数 (x,n-x) 成对出现,平均值为 (n/2) 。因此,与 (n) 互质的数的平均值也是 (n/2) ,性质 (1) 成立。
根据欧拉函数的计算式,因为 (gcd(a,b)=1) ,所以它们没有除了 (1) 以外的公约数,计算时不会重复出现 ((1-frac{1}{p})) ,性质 (2) 成立。
若 (pmid n) 且 (p^2mid n) ,则 (n,n/p) 包含相同的质因子,按照欧拉函数的计算公式,两者相除商为 (p) ,性质 (3) 成立。
若 (pmid n) 且 (p^2 ot|n) ,则 (gcd(n,n/p)=1) ,由 (varphi) 是积性函数得 (varphi(n)=varphi(n/p)*varphi(p)) 。其中 (varphi(p)=p-1) ,性质 (4) 成立。
设 (f(n)=sumlimits_{d|n}varphi(d)) 。用乘法分配率展开比较,再利用 (varphi) 是积性函数,得到:若 (gcd(n,m)=1) ,则 (f(nm)=sumlimits_{d|nm}varphi(d)=(sumlimits_{d|n}varphi(d))*(sumlimits_{d|m}varphi(d))=f(n)*f(m)) 。即 (f) 是积性函数,对于单个质因子, (f(p^m)=sumlimits_{d|p^m}varphi(d)=varphi(1)+varphi(p)+varphi(p^2)+cdots+varphi(p^m)) 是一个等比数列求和再加 (1) ,结果为 (p^m) 。所以 (f(n)=prodlimits_{i=1}^m f(p_i^{c_i})=prodlimits_{i=1}^m p_i^{c_i}=n) ,性质 (5) 成立。
例题
题面
Solution
分析题目可以发现,除了 ((1,0)) , ((0,1)) 和 ((1,1)) 三个点之外,一个钉子 ((x,y)) 能被看到,当且仅当 (gcd(x,y)=1) 时成立。
由于能看到的钉子明显是关于 (y=x) 这条直线对称的,所以我们只需要求其中一半即可。对于该坐标系的右下方可以看到的钉子,满足对于每个 (2leq xleq N) 都有 (1leq y<x,gcd(x,y)=1) 。这样的 (y) 的数量恰好就是 (varphi(x)) 。
综上所述,本题的答案就是 (3+2*sumlimits_{i=2}^Nvarphi(i)) 。我们要做的就是求出 (2sim N) 中每个数的欧拉函数。
Code
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
template<class T>void read(T &x)
{
x=0;char k=getchar();int f=1;
for(;k>'9'||k<'0';k=getchar()) if(k=='-') f=-1;
for(;k>='0'&&k<='9';k=getchar()) x=x*10+k-'0';
x*=f;
}
int n,ans;
int prime[40005],tot,phi[40005];
bool is_not_pr[40005];
inline void prepare()
{
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!is_not_pr[i])
{
prime[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot&&i*prime[j]<n;j++)
{
is_not_pr[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
}
int main()
{
read(n);
if(n==1) printf("0");
else
{
prepare();
for(int i=2;i<n;i++) ans+=phi[i];
printf("%d
",ans*2+3);
}
return 0;
}
总结
这一部分的题要善于问题转化,将问题化简为可做的模式,同时它的拓展——欧拉反演也是比较重要的一类题,要抽时间去看一下。