互质与欧拉函数学习笔记

互质与欧拉函数学习笔记

互质

定义:

(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))

  • 性质
    1. (forall n>1,1sim n) 中与 (n) 互质的数之和为 (n*varphi(n)/2)
    2. (a,b) 互质,则 (varphi(ab)=varphi(a)varphi(b))
    3. (p) 为质数,若 (pmid n)(p^2mid n) ,则 (varphi(n)=varphi(n/p)*p)
    4. (p) 为质数,若 (pmid n)(p^2 ot|n) ,则 (varphi(n)=varphi(n/p)*(p-1))
    5. (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) 成立。

例题

题面

Luogu P2158 [SDOI2008]仪仗队

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;
}

总结

这一部分的题要善于问题转化,将问题化简为可做的模式,同时它的拓展——欧拉反演也是比较重要的一类题,要抽时间去看一下。

原文地址:https://www.cnblogs.com/TheShadow/p/11401468.html