买竹子
欧拉筛素数,然后做一个标记,对每次输入就可以直接对应下标查找加加了。
每个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;
}