873. 欧拉函数
欧拉函数定义:
代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_map>
using namespace std;
typedef long long LL;
int main ()
{
// vector<int> prime;
int n;
cin >> n;
while (n--)
{
unordered_map<int, int> prime;
int a;
cin >> a;
LL res = a;
// cout << res << endl;
for (int i = 2; i <= a/i; ++i)
{
while (a%i == 0)
{
a /= i;
prime[i] ++;
}
}
if (a > 1) prime[a] ++;
for (auto p : prime)
{
int t = p.first;
res = res/t*(t-1);
// cout << res << endl;
}
cout << res << endl;
}
}
874. 筛法求欧拉函数
当i是质数的时候,i的倍数的质数就是i的倍数乘(i-1)/ i。其实就是我们上面提到的公式。所以代码如下:
for (int i = 2; i <= MAXN; ++i)
{
if (phi[i] == i) // i is prime
{
for (int j = i; j <= MAXN; j += i)
{
phi[j] = phi[j] / i * (i - 1);
}
}
}
全部代码如下:
#include <iostream>
#include <vector>
using namespace std;
typedef long long LL;
const int MAXN = 1000000;
int phi[MAXN + 1];
void initPhi()
{
for (int i = 1; i <= MAXN; ++i)
phi[i] = i;
for (int i = 2; i <= MAXN; ++i)
{
if (phi[i] == i) // i is prime
{
for (int j = i; j <= MAXN; j += i)
{
phi[j] = phi[j] / i * (i - 1);
}
}
}
}
int main()
{
int n;
cin >> n;
initPhi();
LL sum = 0;
for (int i = 1; i <= n; ++i)
{
sum += phi[i];
}
cout << sum << endl;
return 0;
}