携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
什么是欧拉函数?
在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目. 简单来说欧拉函数就是1~n有几个素数
欧拉函数的标准定义:
我们有两种欧拉函数一种就是按照定义来求欧拉函数(虽然不是很建议大家用这样的方法) 这里就直接给大家看看代码总览~
定义求欧拉函数代码总览:
给n个正整数ai,求每个数的欧拉函数 这里需要看到的是,用定义求欧拉函数很麻烦,对于这样的问题重复度较高,所以就有了接下来的用欧拉筛法求欧拉函数
欧拉筛法求欧拉函数:
比如这题:给定一个数n,求1n欧拉函数之和(数据范围为110^6)
关键代码呈现:
typedef long long LL;
const int N = 1000010;
int Prime[N], t;
int phi[N];
bool st[N];
LL get_euler(int n) {
phi[1] = 1;
for (int i = 2; i <= n; i++) {
if (!st[i]) {
Prime[t++] = i;
phi[i] = i - 1;
}
for (int j = 0; j < t && Prime[j] * i <= n; j++) {
st[Prime[j] * i] = true;
if (i % Prime[j] == 0) {
phi[Prime[j] * i] = Prime[j] * phi[i];
break;
}
phi[Prime[j] * i] = phi[i] * (Prime[j] - 1);
}
}
LL res = 0;
for (int i = 1; i <= n; i++) {
res += phi[i];
}
return res;
}
接下来介绍一道题:
题目描述:
1∼N 中与 N 互质的数的个数被称为欧拉函数,记为ϕ(N)。
若在算数基本定理中,N=p^a1p^a2…pa^m,则:
ϕ(N) = N×(p1−1)/p1×(p2−1)/p2×…×(pm−1)/pm;
输入格式:
第一行输入一个n,接下来行每行包含一个正整数ai,输出ai的欧拉函数。
数据范围:1<=n<=100,1<=ai<=2*10^9
输出格式:
共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和。
输入样例:
3
3
6
8
输出样例:
2
2
4
思路分析:
按照之前的欧拉函数方法做就好了
代码如下:
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--) {
int num;
cin >> num;
int res = num;
for (int i = 2; i <= num / i; i++) {
if (num % i == 0) {
res = res / i * (i - 1);
while (num % i == 0)
num /= i;
}
}
if (num > 1)
res = res / num * (num - 1);
cout << res << endl;
}
}
PS:成功解题=理清思路+一定的技巧~