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

这道题要找二元组(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
", ans[n] * 2 + 1);
	return 0;
}

原文地址:https://www.cnblogs.com/sugewud/p/9819512.html