当前位置: 代码迷 >> 综合 >> 紫书 例题 10-7 UVa 10820 (欧拉函数)
  详细解决方案

紫书 例题 10-7 UVa 10820 (欧拉函数)

热度:52   发布时间:2023-09-20 21:05:13.0

这道题要找二元组(x, y) 满足1 <= x, y <= n 且x与y互素

那么我就可以假设x < y, 设这时答案为f(n)

那么答案就为2 * f(n) +1(x与y反过来就乘2,加上(1,1))

那么f(n)可以用欧拉函数求

显然f(n) = phi(2) + phi(3) + ……+phi(n)

#include<cstdio>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;const int MAXN = 51234;
int euler[MAXN], ans[MAXN], n;void init()
{REP(i, 1, MAXN) euler[i] = i;REP(i, 2, MAXN)if(euler[i] == i)for(int j = i; j < MAXN; j += i)euler[j] = euler[j] / i * (i - 1);REP(i, 2, MAXN) ans[i] = ans[i-1] + euler[i];
}int main()
{init();while(~scanf("%d", &n) && n) printf("%d\n", ans[n] * 2 + 1);return 0;
}