题意:
思路:找到规律,当i为素数时,f[i]=2;当i不是素数时,若i有一个因子的次数是3或以上,那么f[i]=0。再来看线性筛,本质是筛掉最小质因子,如果i不能整除prime[j],那么f[i*prime[j]]=f[i]*2。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=2000005;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int vis[maxn],prime[maxn],tot,f[maxn];
ll sum[maxn];
void shai()
{
tot=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<maxn;i++)
{
f[i]=1;
if(!vis[i])
{
prime[tot++]=i;
f[i]=2;
}
for(int j=0;j<tot&&i*prime[j]<maxn;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) //筛到最小质因子
{
if(i%(prime[j]*prime[j])==0)
{
f[i*prime[j]]=0;
}
else
f[i*prime[j]]=f[i]/2;
break;
}
else
{
f[i*prime[j]]=f[i]*2;
}
}
}
for(int i=1;i<maxn;i++)
{
sum[i]+=(sum[i-1]+f[i]);
}
}
int main()
{
int t;
cin>>t;
shai();
while(t--)
{
int n;
scanf("%d",&n);
printf("%lld\n",sum[n]);
}
return 0;
}