欧拉函数基础

欧拉函数:

(这里附带一句:这里给的数N一般是正的合数,因为,如果N为质数的话,那么\phi(N)=N-1)

基本问题:给定一个正整数n,求得1-n中,有多少个与它互为质数的数。

1.暴力做法:直接判断1-n中每个数,是否与n互为质数。   

   时间复杂度:O(n*logn)

代码实现:

#include<bits/stdc++.h>
using namespace std;
int n,ans=0;

int gcd(int a,int b){
	if(b==0) return a;
	else return gcd(b,a%b);
}

int main(){
	cin>>n;
	cout<<"1-N中与N互为质数的数:";
	for(int i=1;i<=n;i++)
		if(gcd(i,n)==1){
			cout<<i<<" ";
			ans++;
		}
	cout<<endl<<"1-N中与N互为质数的个数:"<<ans;	
}

那么当然了,n*logn>n的,在处理大数据的时候,这个肯定会TLE的,那么就有了欧拉的由来!

前置芝士:需要理解欧拉函数的本质

这里简要的说明一下怎么用这个结论公式:

2.欧拉函数:在找出因数的同时,判断是否为质数,再运用公式

时间复杂度:O(sqrt(n))----根号N

代码实现:

#include<bits/stdc++.h>
using namespace std;
int n,ans;

int solve(){
	cin>>n;
	ans=n;
	for(int i=2;i*i<=n;i++){//从2开始枚举到sqrt(N)
		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;
}

int main(){
	cout<<solve();
}

以上就是欧拉函数的一些基础芝士啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值