鏈接:https://ac.nowcoder.com/acm/contest/1221/A
來源:牛客網
目描述
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≤3e71 \leq n \leq 3e71≤n≤3e7
思路:看到質數想到篩法求素數,你會發現篩法的第二個for循環就是找出質因數i的在n裏內所有數所以我們直接循環幾次加幾個即可,不過這樣會出現一個bug就是2的倍數你會曬3的倍數你會曬例如6你就篩了兩次所以直接if判斷曬還是沒曬過即可
#include<iostream>
#define ll long long
using namespace std;
ll sum ;
const ll maxn = 3e7+3;
ll a[maxn];
void prime(ll n) {
a[1] = 1;
for(ll i = 2;i <= n;++i) {
if(a[i]) {
continue;
}
for(ll j = 1;j*i <= n;++j) {
if(!a[i]) {
sum += i;a[i*j] = 1;//在篩法裏求一下有多少數是i爲最小公因子數
}
}
}
}
int main() {
ll n;
scanf("%lld", &n);
sum = 0;
prime(n);
printf("%lld\n", sum);
return 0;
}