题意:输入n,定义一个二元组(x,y),满足1<=x,y<=n , 且x和y互质 , 要求输出二元组的个数,注意(x,y)和(y,x)是不同的,(1,1)是特殊的,所以结果就是2*arr[n]-1,方法就是欧拉函数求小于n且与n互素的个数,套用模板就行了,
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int MAXN = 50010;
int n,vis[MAXN],arr[MAXN];
void init(){
memset(vis,0,sizeof(vis));
vis[1] = 1;
n = MAXN;
for (int i = 2; i <= n; i++)
if (!vis[i]){
for (int j = i; j <= n; j += i){
if (!vis[j])
vis[j] = j;
vis[j] = vis[j]/i*(i-1);
}
}
arr[0] = 0;
for (int i = 1; i <= n; i++)
arr[i] = arr[i-1] + vis[i];
}
int main(){
init();
while (scanf("%d",&n) != EOF && n){
printf("%d\n",2*arr[n]-1);
}
return 0;
}