欧拉函数:![](https://i-blog.csdnimg.cn/blog_migrate/8e91cc34b41c2b96201b5cf77b54ee4f.png)
(这里附带一句:这里给的数N一般是正的合数,因为,如果N为质数的话,那么(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();
}
以上就是欧拉函数的一些基础芝士啦!