这道题就是是一个线性筛选 我们这里使用欧拉筛选…对于每一个合数,他被筛选出去一定是他的最小质因数乘以他的除了他自身的最大因子。这个就是原理.证明部分请看其他博主(证明好像挺难的,数学没学好的就没看了,记住结论就行) PS:在这种卡时间的题目,不必要的语句就别写了…时间卡的很紧的
下面是AC代码:
#include <iostream>
#include <unordered_map>
#include <cstring>
using namespace std;
#define Max 100000001
bool map[Max];
int a[Max];
int num=0;
void init(int n);
int main()
{
ios::sync_with_stdio(false);
int n,m,x;
cin>>n>>m;
init(n);
for(int i=1;i<=m;i++)
{
cin>>x;
cout<<a[x]<<endl;
}
return 0;
}
void init(int n)
{
for(int i=2;i<=n;i++)
{
if(map[i]==false) //如果是素数
{
a[++num]=i;
}
for(int j=1;j<=num&&i*a[j]<=n;j++)
{
map[i*a[j]]=true;//合数标记为非素数
if(i%a[j]==0) //如果i 的最小质因子是a[j]
{
break;
}
}
}
}