题目
题目描述
Forsaken有一个有趣的数论函数。对于任意一个数xxx,f(x)f(x)f(x)会返回xxx的最小质因子。如果这个数没有最小质因子,那么就返回0。
现在给定任意一个nnn,Forsaken想知道∑i=1nf(i)\sum_{i = 1}^{n}{f(i)}∑i=1nf(i)的值。
输入描述:
一个整数nnn。
输出描述:
一个整数代表上面的求和式的值。
示例1
输入
4
输出
7
备注:
1≤n≤3e7
题解
思路:本题本质上就是个欧拉筛,在筛数的时候加上最小质因数的值就好了。
ACcode
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=3e7+5;
ll st[N],prim[N];
ll sai(ll n)//欧拉筛
{
ll cnt=1,ans=0;
st[1]=1;
for(ll i=2;i<=n;i++)
{
if(!st[i])
{
prim[cnt++]=i;
ans+=i;
}
for(ll j=1;prim[j]*i<=n;j++)
{
st[i*prim[j]]=1;
ans+=prim[j];
if(i%prim[j]==0) break;
}
}
return ans;
}
int main()
{
ll x;cin>>x;
cout<<sai(x)<<endl;
return 0;
}