思路:
(1)欧拉函数:输入n则输出1~n中与n互质的数的个数。
(2)计算公式:
(3)证明:(容斥原理)对于n个数,先分别摘除所有被pi整除的数,再回补pij,再删去pijk;相当于n - n/p1 - n/p2.. - n/pk + n /p1p2 + n/p1p3 + ... +n/pk-1pk - p1p2p3 ....;将其利用分配律结合即为欧拉函数计算公式。
(4)实现:对于x,res初始化为x,先进行质因子分解,拿到质因子后,res = res/n*(n - 1);
代码:
#include<bits/stdc++.h>using namespace std;int main()
{int n;cin >> n;while(n --){int x;cin >> x;int res = x;for(int i = 2;i <= x/i;i ++){if(x % i == 0)res = res/i*(i - 1);while(x % i == 0){x /= i;}}if(x > 1) res = res/x*(x - 1);cout << res << endl;}return 0;
}