/***********************
题目大意:找出1-N之间的素数(此题中1也算做素数)与N互素的数的个数,假设非互素素数的个数为num,则输出N-num;
题目解析:先找出能整除N的数i,再运用筛选法先求出i小于N的倍数,再用a[j ]数组判断n与j不互素,再用num计算与n不互素的数的个数,输出n-num;
易错分析:1. 应先判断a[j]是否是否应经赋值为1了,这样可避免多计算一次j;
2.n/=i;i=2;可减少循环次数;
*************************/
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int t,n,n1,i,j,num,a[32770];
scanf("%d\n",&t);
while(t--)
{
scanf("%d",&n);
n1=n;
i=2;
num=0;
memset(a,0,sizeof(a));
while(n>=i)
{
if(n%i==0&&!a[i])
//仅对n的约数运用筛选法筛选,且对i还没有筛选的约数进行筛选;
{
for(j=i;j<=n1;j+=i)
{
if(!a[j])
//先判断a[j]是否已经判断了,若还没判断num++;
num++;
a[j]=1;
}
n/=i;
//减少循环次数;
i=2;
}
i++;
}
printf("%d\n",n1-num);
}
return 0;
}