关于线性筛的实现
  • 板块学术版
  • 楼主Hanghang
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/8/9 16:16
  • 上次更新2023/10/27 16:16:53
查看原帖
关于线性筛的实现
178992
Hanghang楼主2022/8/9 16:16
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++)

为啥要加等号?

2022/8/9 16:16
加载中...