const int N=10000003;
long long pri[N],P,n;
bool v[N];
void W()
{
v[0]=v[1]=1;
for(int i=2;i<N;i++)
{
if(!v[i])pri[++P]=i;
for(int j=1;j<=P&&i<=N/pri[j];j++)
{
v[i*pri[j]]=1;
if(i%pri[j]==0)break;
}
}
}
上面的实现是对的
而下面的实现就错了
const int N=10000003;
long long pri[N],P,n;
bool v[N];
void W()
{
v[0]=v[1]=1;
for(int i=2;i<N;i++)
{
if(!v[i])pri[++P]=i;
for(int j=1;j<=P&&i<N/pri[j];j++)
{
v[i*pri[j]]=1;
if(i%pri[j]==0)break;
}
}
}
差别只有
for(int j=1;j<=P&&i<N/pri[j];j++)
for(int j=1;j<=P&&i<=N/pri[j];j++)
为啥要加等号?