当前位置:网站首页>欧拉函数(用欧拉筛法求欧拉函数)
欧拉函数(用欧拉筛法求欧拉函数)
2022-08-11 07:49:00 【疯疯癫癫才自由】
873. 欧拉函数
给定 n
个正整数 ai
,请你求出每个数的欧拉函数。
欧拉函数的定义
1∼N
中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。
若在算数基本定理中,N=pa11pa22…pamm,则:
ϕ(N) = N×p1−1p1×p2−1p2×…×pm−1pm
输入格式
第一行包含整数 n
。
接下来 n
行,每行包含一个正整数 ai
。
输出格式
输出共 n
行,每行输出一个正整数 ai
的欧拉函数。
数据范围
1≤n≤100
,
1≤ai≤2×109
输入样例:
3
3
6
8
输出样例:
2
2
4
* 欧拉函数的定义
* 1∼N中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。
* 若在算数基本定理中,N=p1^e1*p2^e2*...*pk^ek;则:
* phi(N)=N/p1*(p1-1)/p2*(p2-1)/.../pk*(pk-1);
/**
* 欧拉函数的定义
* 1∼N中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。
* 若在算数基本定理中,N=p1^e1*p2^e2*...*pk^ek;则:
* phi(N)=N/p1*(p1-1)/p2*(p2-1)/.../pk*(pk-1);
*/
#include <iostream>
#include <vector>
using namespace std;
int phi(int v)
{
int res=v;
vector<int> vec;
for(int i=2;i<= v/i;++i)
{
if(v%i==0)
{
vec.push_back(i);
while(v%i==0)
v/=i;
}
}
if(v>1)
vec.push_back(v);
for(auto a:vec)
res=res/a*(a-1);
return res;
}
int main()
{
int n;
cin >> n;
while (n -- )
{
int v;
cin >> v;
cout << phi(v) << endl;
}
return 0;
}
874. 筛法求欧拉函数
给定一个正整数 n
,求 1∼n
中每个数的欧拉函数之和。
输入格式
共一行,包含一个整数 n
。
输出格式
共一行,包含一个整数,表示 1∼n
中每个数的欧拉函数之和。
数据范围
1≤n≤106
输入样例:
6
输出样例:
12
void get_phi(int v)
{
phi[1]=1;
for(int i=2;i<=v;++i)
{
if(hs[i]==0)
{
p[num++]=i;
phi[i]=i-1; //如果i是质数
}
for(int j=0;p[j]<=v/i;++j)
{
hs[p[j]*i]=1;
if(i%p[j]==0)
{
phi[p[j]*i]=phi[i] * p[j]; //如果p[j]是i的约数,那么p[j]一定是p[j]*i的约数
break;
}
else
phi[p[j]*i]=phi[i] * (p[j]-1); //如果p[j]不是i的约数,但是p[j]一定是p[j]*i 的约数
}
}
}
/**
* 利用欧拉筛法求质数的过程求1——N的欧拉函数
*/
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e6+10;
int p[maxn],num=0,phi[maxn];
bool hs[maxn];
void get_phi(int v)
{
phi[1]=1;
for(int i=2;i<=v;++i)
{
if(hs[i]==0)
{
p[num++]=i;
phi[i]=i-1; //如果i是质数
}
for(int j=0;p[j]<=v/i;++j)
{
hs[p[j]*i]=1;
if(i%p[j]==0)
{
phi[p[j]*i]=phi[i] * p[j]; //如果p[j]是i的约数,那么p[j]一定是p[j]*i的约数
break;
}
else
phi[p[j]*i]=phi[i] * (p[j]-1); //如果p[j]不是i的约数,但是p[j]一定是p[j]*i 的约数
}
}
}
int main()
{
int n;
cin >> n;
get_phi(n);
LL res=0;
for(int i=1;i<=n;++i)
res+=phi[i];
cout << res << endl;
return 0;
}
边栏推荐
猜你喜欢
随机推荐
TF中的条件语句;where()
Four startup modes of Activity
为什么会没有内存了呢
1061 判断题 (15 分)
1101 B是A的多少倍 (15 分)
查询跟踪快递单号物流,智能分析物流中转有延误的单号
1071 Small Gamble (15 points)
1.2-误差来源
AcWing 272. 最长公共上升子序列
2022 China Soft Drink Market Insights
My creative anniversary丨Thank you for being with you for these 365 days, not forgetting the original intention, and each is wonderful
1003 I want to pass (20 points)
About # SQL problem: how to set the following data by commas into multiple lines, in the form of column display
1096 大美数 (15 分)
1046 punches (15 points)
matplotlib
关于架构的认知
opengauss创建用户权限问题
查找最新人员工资和上上次人员工资的变动情况
One-hot in TF