链接: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<bits/stdc++.h>
using namespace std;
const int maxn = 3e7+2;
bool map1[maxn];
int main() {
int n;
scanf("%d", &n);
long long sum = 0;
for(int i = 2;i <= n;++i) {
if(map1[i]) {
continue;
}
for(int j = 1;j*i <= n;++j) {
int sumv = i*j;
if(!map1[sumv]) {
sum += i;
map1[sumv] = 1;
}//在筛法里求一下有多少数是i为最小公因子数
}
}
printf("%lld\n", sum);
return 0;
}