题目链接:https://nanti.jisuanke.com/t/A1956
题解:因为线性筛是用最小素因子筛出来的,在开一个数组记录下最小素因子的个数,若个数大于2个,肯定就不符合,等于两个就一边一个,1个的话就随便放了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e7+10;
int prime[N],len,fac[N],f[N];
bool isp[N];
int sum[N];
void init()
{
f[1]=1;
int tmp;
for(int i=2;i<=20000000;i++)
{
if(!isp[i])
{
prime[len++]=i;
fac[i]=1;
f[i]=2;
}
for(int j=0;j<len&&(ll)i*prime[j]<=20000000;j++)
{
isp[i*prime[j]]=1;
tmp=i*prime[j];
if(i%prime[j]==0)
{
fac[tmp]=fac[i]+1;
if(fac[tmp]>2) f[tmp]=0;
else
{
f[tmp]=f[i/prime[j]];
}
break;
}
else
{
f[tmp]=f[i]*2;
fac[tmp]=1;
}
}
}
for(int i=1;i<=20000000;i++)
sum[i]=sum[i-1]+f[i];
}
int main()
{
init();
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d\n",sum[n]);
}
return 0;
}