题意:
求二元组(x,y)的个数,二元组满足x,y属于[1,n](1<=n<=50000)且x,y互质。
算法:
x,y互质,假设x<y,则y在1-n之间枚举值,求比y小且与它互质的数的个数,即转
化为求1-n中所有数的欧拉函数值。
由于x,y可交换位置且(y,x)不能由(x,y)推出,故应该ans = sum( 2*phi[i] )(1<=i<=n) ,
但是1的欧拉函数值为1,比较特殊,乘以2的过程中(1,1)重复计算了,故要减去,即结
果为ans = sum( 2*phi[i] )-1(1<=i<=n) 。
#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 50010
using namespace std;
int phi[maxn],sum[maxn];
void pri_table(int n)
{
for(int i=2;i<=n;i++)
phi[i] = 0;
phi[1] = 1;
for(int i=2;i<=n;i++)
{
if(!phi[i])
{
for(int j = i;j<=n;j+=i)
{
if(!phi[j]) phi[j] = j;
phi[j] = phi[j]/i*(i-1);
}
}
}
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
sum[i] = sum[i-1]+phi[i];
}
int main()
{
int n;
pri_table(50000);
while(scanf("%d",&n) && n)
{
printf("%d\n",sum[n]*2-1);
}
return 0;
}