买竹子
欧拉筛素数,然后做一个标记,对每次输入就可以直接对应下标查找加加了。
每个i找一个数的欧拉值大于等于i,这个数一定是位于i的右半轴的离他最近的那个素数。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+1000;
int a[maxn],v[maxn],p[100000];
ll ans;
void init()
{
int tot=0;
memset(v,0,sizeof(v));
for(int i=2;i<maxn;i++)
{
if(!v[i])
p[tot++]=i;
for(int j=0;j<tot&&i*p[j]<maxn;j++)
{
v[i*p[j]]=1;
if(i%p[j]==0)
break;
}
}
tot=0;
for(int i=1;i<maxn-100;i++)
{
if(i<p[tot])
a[i]=p[tot];
else
{
a[i]=p[++tot];
}
}
}
int main()
{
init();
int n,k;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>k;
ans+=a[k];
}
cout<<ans;
}
本文介绍了一种使用欧拉筛算法快速求解素数的方法,并通过C++代码实现了该算法。通过对每个数找到一个欧拉值大于等于自身的素数进行标记,实现了高效的素数筛选过程。
196

被折叠的 条评论
为什么被折叠?



