//本地没有跑出来,栈爆了,但是叫上去Ac了
//看了cxlove写的可以dfs中可以for枚举素数
#include<stdio.h>
#include<string.h>
#include<math.h>
typedef __int64 lld;
const int maxn=1000005;
int flag[maxn];
int prime[maxn];
int cnt;
lld n;
lld limit;
lld ans;
void init(){
int i,j;
cnt=0;
memset(flag,0,sizeof(flag));
for(i=2;i<maxn;i++)
if(!flag[i]){
prime[cnt++]=i;
if((lld)i*i>maxn)continue;
for(j=i*i;j<maxn;j+=i)
flag[j]=1;
}
}
void dfs(lld m,int k,int flag){
if(m>limit)return ;
if(k>=cnt||prime[k]>limit){
if(!flag)return;
if(flag&1)ans-=n/(m*m);
else ans+=n/(m*m);
return ;
}
lld tmp=m*prime[k];
if(tmp>limit){
if(!flag)return;
if(flag&1)ans-=n/(m*m);
else ans+=n/(m*m);
return;
}
dfs(m*prime[k],k+1,flag+1);
dfs(m,k+1,flag);
}
int main(){
init();
int T;
int i,j;
scanf("%d",&T);
while(T--){
scanf("%I64d",&n);
ans=n;
limit=sqrt(n);
dfs(1,0,0);
printf("%I64d\n",ans);
}
return 0;
}
无平方因子数 UESTC 1720
最新推荐文章于 2018-12-08 18:23:31 发布