欧拉函数 把n分解质因数=p1^(a1)*p2^(a2)……pn^(an) 则小于n且与n互质的数的个数 Φ=p1^(a1-1)*(p1-1)*p2^(a2-1)*(p2-1)……pn^(an-1)*(pn-1)
int eular(int n)
{
int ret=1,i;
for (i=2;i*i<=n;i++)
if (n%i==0){
n/=i,ret*=i-1;
while (n%i==0)
n/=i,ret*=i;
}
if (n>1)
ret*=n-1;
return ret;
}
#include <stdlib.h>
#include<stdio.h>
#define N 50000
int main()
{
int *phi,i,j;
char *prime;
prime=(char*)malloc((N+1)*sizeof(char));
prime[0]=prime[1]=0;
for(i=2;i<=N;i++)
prime[i]=1;
for(i=2;i*i<=N;i++)
{
if(prime[i])
{
for(j=i*i;j<=N;j+=i)
prime[j]=0;
}
} //这段求出了N内的所有素数
phi=(int*)malloc((N+1)*sizeof(int));
for(i=1;i<=N;i++)
phi[i]=i;
for(i=2;i<=N;i++)
{
if(prime[i])
{
for(j=i;j<=N;j+=i)
phi[j]=phi[j]/i*(i-1); //此处注意先/i再*(i-1),否则范围较大时会溢出
}
}
int t;
scanf("%d",&t);
while(t--){
int sum=0;
int n;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum+=phi[i];
}
printf("%d\n",sum-1);
}
return 0;
}