其他分享
首页 > 其他分享> > 欧拉函数

欧拉函数

作者:互联网

欧拉函数

1.利用欧拉函数

1.欧拉函数是用来求1-N之中与N互质的数的个数,如6有1,5两个小于他的互质数互质数指两束数最大公约数是1)

欧拉函数

$$
\varphi=N*(1-p_{1}))*(1-p_{2})*......(1-p_{n})
$$

这些p是n的约数前面在约数相关的文章中讲过,一个数可以分为

$$
N=p_{1}^{x_{1}}*p_{2}^{x_{2}}*p_{3}^{x_{3}}........*p_{n}^{x_{n}}
$$

然后就只要找约数就可以了

#include<bits/stdc++.h>
using namespace std;

int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int res=n;
for(int i=2;i<=n/i;i++){//求约数操作
if(n%i==0){
res=res/i*(i-1);
while(n%i==0){
n/=i;
}
}
}
if(n>1){
res=res/n*(n-1);//如果大于1则也是约数
}
cout<<res<<endl;
}
return 0;
}

2.线性筛求解

#include<iostream>
using namespace std;
const int N=1e8+100;
int n,prime[6000000],cnt,q,el[6000000];
bool isprime[N];
void judge(int n){
for(int i=2;i<=n;i++){
if(!isprime[i]) {
prime[++cnt]=i;
            el[i]=i-1;//奇数的话肯定和小于他的数都是互质的
      }
for(int j=1;j<=cnt&&prime[j]*i<=n;j++){
isprime[prime[j]*i]=1;
if(i%prime[j]==0) {
el[prime[j]*i]=el[i]*prime[j];//如果prime[j]是i的一个因子,则之前一定已经乘过
          break;
          }
           el[prime[j]*i]=el[i]*(prime[j]-1);//如果不是因子则要再乘上一个1-1/prime[j];
}
}
}
int main(){
cin>>n>>q;
judge(n);
for(int i=1;i<=q;i++){
int x;
cin>>x;
cout<<prime[x]<<endl;
}
return 0;
}
 

标签:prime,el,函数,int,res,cin,约数,欧拉
来源: https://www.cnblogs.com/silky----player/p/16519251.html