修改代码如下:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000010;
int n,q,prime[maxn];
bool mark[maxn];
int tot;

int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
    while(ch>='0'&&ch<='9')
		x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return x*f;
}

void olprim(int n)
{
	tot=0;
	memset(mark, false, sizeof(mark));
	for(int i=2;i<=n;i++)
	{
		if(!mark[i]) prime[++tot]=i;
		for(int j=1;j<=tot;j++)
		{
			if(i*prime[j]>n) break;
			mark[i*prime[j]]=1;
			if(i%prime[j]==0) break;	
		}
	}
}

int main()
{
    n=read(),q=read();
    olprim(n);
    while(q--)
    {
    	int k=read();
    	printf("%d\n",prime[k]);
	}
    return 0;
}

修改后的代码中,增加了一个const int maxn常量用于定义数组的最大长度,避免超出数组大小。同时,在olprim函数中增加了一个memset函数,用于初始化mark数组

#includebitsstdc++husing namespace std;int nqprime100000010;bool mark100000010;long long ans;int read int x=0f=1; char ch=getchar; whilech0ch9			ifch==-			f=-1;		ch=getchar;	 whilech=0&&ch

原文地址: https://www.cveoy.top/t/topic/iRMR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录