题目大意:
求1~n之间共有多少对互质的数。
欧拉函数:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn)。
*需要注意的地方是用欧拉函数筛出来的会有重复。
#include <stdio.h>
using namespace std;
int ss[50010];
int main()
{
int i,j;
for (i = 0;i < 50010;i++) ss[i] = i;//赋初值
for (i = 2;i < 50010;i++)
{
if (ss[i] == i) //用质数筛
{
for (j = i;j < 50010;j+=i)//筛除i~50010间含有i的质因子
{
ss[j] = ss[j]/i*(i-1);//欧拉函数中的(1-1/p)
}
}
}
int n;
while (~scanf("%d",&n))
{
if (n == 0) break;
int sum =0 ;
for (i = 1;i<=n;i++)
{
sum += ss[i];
}
printf("%d\n",sum*2-1);
}
return 0;
}