这道题先得到素数,然后用递归写容斥就ok了,就是容易TLE!
#include<stdio.h>
#include<string.h>
#define MAXN 1000005
int prime[MAXN],flag[MAXN];
int cnt=0;
long long n;
void get_prime()
{
memset(prime,0,sizeof(prime));
memset(flag,0,sizeof(flag));
for(int i=2;i<=MAXN;i++)
{
if(flag[i]) continue;
prime[cnt++]=i;
for(int j=2;j*i<MAXN;j++) flag[i*j]=1;
}
}
long long dfs(int s,long long num)
{
long long ans=0;
for(int i=s;i<cnt&&(long long)prime[i]*prime[i]<=num;i++)
ans+=num/prime[i]/prime[i]-dfs(i+1,num/prime[i]/prime[i]);
return ans;
}
int main()
{
int T;
get_prime();
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
printf("%lld\n",n-dfs(0,n));
}
return 0;
}