ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

欧拉函数

2022-07-25 23:34:24  阅读:161  来源: 互联网

标签:prime el 函数 int res cin 约数 欧拉


欧拉函数

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有