#include<bits/stdc++.h>
using namespace std;
long long v[10000002],prime[10000002];
void zhishu(){
long long m=0;
memset(v,0,sizeof(v));
memset(prime,0,sizeof(prime));
for(long long i=2;i<=10000000;i++){
if(v[i]==0){
v[i]=i;prime[++m]=i;
}
for(long long j=1;j<=m;j++){
if(prime[j]>v[i]||prime[j]>10000000/i)break;
v[i*prime[j]]=prime[j];
}
}
}
int main()
{
int t;
scanf("%d",&t);
zhishu();
while(t--){
long long n;
scanf("%lld",&n);
long long sum=0;
sum=(3+n)*(n-2)/2;
for(long long i=1;;i++){
if(n<prime[i])break;
sum+=prime[i];
}
sum-=2;
printf("%lld\n",sum);
}
return 0;
}
优化,二分+贪心
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+2;
long long v[maxn],prime[maxn],s[maxn];
long long m=0;
void zhishu(){
s[0]=0;
memset(v,0,sizeof(v));
memset(prime,0,sizeof(prime));
for(long long i=2;i<=10000000;i++){
if(v[i]==0){
v[i]=i;
prime[++m]=i;
s[m]=s[m-1]+i;
}
for(long long j=1;j<=m;j++){
if(prime[j]>v[i]||prime[j]>10000000/i) break;
v[i*prime[j]]=prime[j];
}
}
}
int main()
{
int t;
scanf("%d",&t);
zhishu();
while(t--){
long long n;
scanf("%lld",&n);
long long sum=0;
sum=(3+n)*(n-2)/2;
int k=lower_bound(prime+1,prime+m+1,n)-prime;
if(prime[k]>n)sum+=s[k-1];
else sum+=s[k];
sum-=2;
printf("%lld\n",sum);
}
return 0;
}