UVA 11426 GCD - Extreme (II) (欧拉函数+筛法)

时间:2023-03-09 23:58:17
UVA 11426 GCD - Extreme (II) (欧拉函数+筛法)

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70017#problem/O

题意是给你n,求所有gcd(i , j)的和,其中1<=i <j <n。

要是求gcd(n , x) = y的个数的话,那么就是求gcd(n/y , x/y) = 1的个数,也就是求n/y的欧拉函数。这里先预处理出欧拉函数,然后通过类似筛法的技巧筛选出答案累加起来。

 #include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = ;
typedef long long LL;
int p[MAXN];
LL a[MAXN]; void init() {
for(int i = ; i < MAXN ; i++)
p[i] = i;
for(int i = ; i < MAXN ; i++) {
if(p[i] == i) {
for(int j = i ; j < MAXN ; j += i)
p[j] = p[j] / i * (i - );
}
}
for(int i = ; i < MAXN ; i++) {
for(int j = * i ; j < MAXN ; j += i) {
a[j] += (LL)i * (LL)p[j / i];
}
}
for(int i = ; i < MAXN ; i++) {
a[i] = a[i] + a[i - ];
}
} int main()
{
init();
int n;
while(cin >> n && n) {
cout << a[n] << endl;
}
}