如何计算62题中的欧拉函数?

摘要:62.Acwing基础课第873题-简单-欧拉函数 题目描述 (给定 n 个正整数 a_i,请你求出每个数的欧拉函数)​。 欧拉函数的定义 (1 sim N) 中与 (N) 互质的数的个数被称为欧拉函数,记为 (phi(N
62.Acwing基础课第873题-简单-欧拉函数 题目描述 \(给定 n 个正整数 a_i,请你求出每个数的欧拉函数\)​。 欧拉函数的定义 \(1 \sim N\) 中与 \(N\) 互质的数的个数被称为欧拉函数,记为 \(\phi(N)\)。 若在算数基本定理中,\(N = p_1^{a_1} p_2^{a_2} \dots p_m^{a_m}\),则: \[\phi(N) = N \times \frac{p_1 - 1}{p_1} \times \frac{p_2 - 1}{p_2} \times \dots \times \frac{p_m - 1}{p_m} \] 输入格式 \(第一行包含整数 n\)。 \(接下来 n 行,每行包含一个整数对 a_i\)。 输出格式 \(输出共 n 行,每行输出一个正整数 a_i 的欧拉函数。\)。 数据范围 \(1≤n≤100\), \(1≤a_i≤2×10^9\) 输入样例: 3 3 6 8 输出样例: 2 2 4 代码: // 包含输入输出流头文件(cin/cout依赖) #include <iostream> // 使用std命名空间,避免重复写std:: using namespace std; // 计算单个整数x的欧拉函数φ(x) // 欧拉函数定义:1~x中与x互质的数的个数 int phi(int x) { // 初始化结果为x(欧拉函数公式的初始值) int res = x; // 质因数分解核心:枚举2到√x的所有数(i<=x/i等价于i<=sqrt(x),避免浮点运算误差) for (int i = 2; i <= x / i; i ++ ) // 若i是x的质因子(能整除x) if (x % i == 0) { // 欧拉函数核心公式:φ(x) = x × (p1-1)/p1 × (p2-1)/p2 × ... × (pn-1)/pn // 先除后乘:res/i*(i-1) 避免中间结果溢出(若先乘后除可能超出int范围) res = res / i * (i - 1); // 循环除净x中所有的质因子i(确保后续i都是新的质因子) while (x % i == 0) x /= i; } // 若循环结束后x>1,说明x本身是一个大于√原数的质因子,需补充计算 if (x > 1) res = res / x * (x - 1); // 返回最终的欧拉函数值 return res; } int main() { int n; // n:测试用例的组数 cin >> n; // 输入测试用例组数 // 循环处理n组测试用例 while (n -- ) { int x; // x:需要计算欧拉函数的整数 cin >> x; // 输入待计算的整数 cout << phi(x) << endl; // 输出φ(x)的结果 } return 0; // 程序正常结束 }