2021.08.10 Euler函数总结

知识:

记 φ(n) 表示在 [1,n] 中与 n互质的数的个数。

1.p为质数,则

\[φ(p^l)=p^l-p=p^{l-1}(p-1) \]

注:每p个数中就有一个数整除p^l

延伸1:若

\[n=p_1^{a_1}*p_2^{a_2}*P_3^{a_3}\cdots p_k^{a_k} \]

\[φ(n)=p_1^{a_1-1}*(p_1-1)*p_2^{a_2-1}*(p_2-1)*p_3^{a_3-1}*(p_3-1)\cdots p_k^{a_k-1}*(p_k-1) \]

延伸2:(m,n)=1,则

\[φ(mn)=φ(m)*φ(n) \]

延伸3:若m|n,则

\[φ(mn)=m*φ(n) \]

延伸4:令

\[f(n)=\sum_{d|n}φ(d) \]

则f(n)=n

注:f(n)为积性函数。令

\[n=p_1^{a_1}*p_2^{a_2}*P_3^{a_3}\cdots p_k^{a_k} \]

\[\begin{aligned} f(p_i^{a_i}) & =φ(1)+φ(p_i)+φ(p_i^2)+\cdots +φ(p_i^{a_i})\\ & =1+(p_i-1)+p_i(p_i-1)+p_i^2(p_i-1)+\cdots +p_i^{a_i-1}(p_i-1)\\ & =p_i^{a_i} \end{aligned} \]

2.若p为质数,则

\[φ(p)=p-1 \]

延伸1:若p为质数,且p是n的最小质因子,p|n,即n=pt,则

\[φ(n)=\left\{ \begin{array}{lr} φ(p)*φ(t)=(p-1)*φ(t) & (p,t)=1\\ p*φ(t) & (p,t)>1 \end{array} \right. \]

3.2|φ(n)(n>2)

注:若(x,n)=1,则(n-x,n)=1,所以当除了n=2*x时,所有x可以两两凑对。

练习题:

UVA11327 Enumerating Rational Numbers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

重点:

1.线性筛欧拉函数

//euler函数+前缀和+暴力二分~ 
#include<cstdio>
#include<iostream>
#include<cstring> 
#include<algorithm>
using namespace std;

const int N=2e5+10;
typedef long long ll;
ll top,k,vis[N],prime[N],oula[N],sum[N];

inline ll read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
int gcd(int x,int y){
	return y==0?x:gcd(y,x%y);
}

int main(){
	//线性筛欧拉函数 
	memset(vis,1,sizeof(vis));
	oula[1]=1;vis[1]=0;
	for(int i=2;i<=2e5;i++){
		if(vis[i])oula[i]=i-1,prime[++top]=i;
		for(int j=1;j<=top;j++){
			if(i*prime[j]>2e5)break;
			vis[i*prime[j]]=0;
			if(i%prime[j])oula[i*prime[j]]=(prime[j]-1)*oula[i];
			else{
				oula[i*prime[j]]=prime[j]*oula[i];
				break;
			}
		}
	}
	
	for(int i=1;i<=2e5;i++)sum[i]=sum[i-1]+oula[i];
	
	while(~scanf("%lld",&k)){
		if(!k)return 0;
		else if(k==1)cout<<"0/1"<<endl;
		else if(k==2)cout<<"1/1"<<endl;
		else{
			--k;
			int x=lower_bound(sum+1,sum+200000+1,k)-sum;
			if(sum[x]==k){
				cout<<x-1<<"/"<<x<<endl;
				continue;
			}
			--x;
			k-=sum[x];
			++x;
			if(k==1){
				cout<<"1/"<<x<<endl;
				continue;
			}else{
				--k;
				for(int j=2;j<x;j++){
					if(gcd(j,x)==1)--k;
					if(!k){
						cout<<j<<"/"<<x<<endl;
						break;
					}
				}
			}
		}
	}
	return 0;
}

UVA10299 Relatives - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

重点:

1.性质1延伸1

//euler函数模板!!!刚打过UVA11327,本座记得很清楚~
//1e9的数据有点大,需要单点求euler函数——分解质因数
//详情请查看《初等数论2》第一章欧拉函数部分 
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;

const int N=1e9+10;
int k;

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
void euler(int x){
	int ans=x,n=x;
	for(int i=2;i*i<=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);
	cout<<ans<<endl;
}

int main(){
	while(~scanf("%d",&k)){
		if(!k)return 0;
		if(k==1)cout<<"0"<<endl;
		else euler(k);
	}
	return 0;
}

UVA10179 Irreducable Basic Fractions - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

//euler函数模板!!!刚打过UVA11327,本座记得很清楚~
//1e9的数据有点大,需要单点求euler函数——分解质因数
//详情请查看《初等数论2》第一章欧拉函数部分 
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;

const int N=1e9+10;
int k;

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
void euler(int x){
	int ans=x,n=x;
	for(int i=2;i*i<=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);
	cout<<ans<<endl;
}

int main(){
	while(~scanf("%d",&k)){
		if(!k)return 0;
		euler(k);
	}
	return 0;
}
 posted on 2021-08-11 00:08  eleveni  阅读(88)  评论(0)    收藏  举报