怎样建个网站/软文广告有哪些
文章目录
- 欧拉函数
- 欧拉定理
- 公式法求欧拉函数
- 筛法求欧拉函数
欧拉函数
欧拉定理
公式法求欧拉函数
题目描述 ;
给定 n 个正整数 ai,请你求出每个数的欧拉函数。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个正整数 ai。
输出格式
输出共 n 行,每行输出一个正整数 ai 的欧拉函数。
数据范围
1≤n≤100,
1≤ai≤2×109
输入样例:
3
3
6
8
输出样例:
2
2
4
公式 :
公式证明 : 容斥原理
AC代码
#include <iostream>
using namespace std;int phi(int x){int res = x;for (int i = 2; i <= x / i; i ++ )if (x % i == 0){res = res / i * (i - 1); //等同于res * (1 - 1 / i);while (x % i == 0) x /= i;}if (x > 1) res = res / x * (x - 1);return res;
}int main(){int n;cin >> n;while (n -- ){int x;cin >> x;cout << phi(x) << endl;}return 0;
}
筛法求欧拉函数
给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和。
输入格式
共一行,包含一个整数 n。
输出格式
共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和。
数据范围
1≤n≤106
输入样例:
6
输出样例:
12
AC代码
#include <iostream>
#include <algorithm>using namespace std;
typedef long long LL;
const int N = 1000010;int primes[N], cnt;
int phi[N];
bool st[N];void get_eulers(int n){phi[1] = 1;for (int i = 2; i <= n; i++){if (!st[i]){primes[cnt++] = i;phi[i] = i - 1; }for (int j = 0; primes[j] <= n / i; j++){st[primes[j] * i] = true;if (i % primes[j] == 0){phi[primes[j] * i] = phi[i] * primes[j]; break;}phi[primes[j] * i] = phi[i] * (primes[j] - 1);}}
}int main(){int n;cin >> n;get_eulers(n);LL res = 0;for (int i = 1; i <= n; i++) res += phi[i];printf("%lld\n", res);return 0;
}