题目描述
定义 F(i)表示整数 i的最小质因子。现给定一个正整数 N,请你求出 ∑2nF(i)。
输入描述
第 1 行为一个整数 T,表示测试数据数量。
接下来的 T 行每行包含一个正整数 N。
输出描述
输出共 T行,每行包含一个整数,表示答案。
输入输出样例
示例 1
输入
3
5
10
15
输出
12
28
59
【思路及代码】
运用埃氏筛进行素数筛选,加前缀和处理最小质因子的和,避免超时
#include<bits/stdc++.h>
using namespace std;
const int N=3e6+10;
typedef long long ll;
ll n,res,prime[N],f[N],st[N],s[N],cnt;
//prime是2-N中的所有质数
//f是每个数的最小质因子
//s是2—N的所有最小质因子的和(前缀和思想)
void get_prime(ll n)
{
for(ll i=2;i<=n;i++)
{
if(!st[i])
{
prime[cnt++]=i;
f[i]=i;//当前数是质数
//最小质因子就是它本身
for(ll j=i*2;j<=n;j+=i)
{
st[j]=1;
f[j]=min(f[j],i);
//j是从i程处运算过来的
}
}
}
}
int main()
{
memset(f,0x3f,sizeof f);
int t;
cin>>t;
get_prime(N);
for(ll i=2;i<=N;i++)
{
s[i]=s[i-1]+f[i];
}
while(t--)
{
scanf("%d",&n);
printf("%lld\n",s[n]);
}
return 0;
}