Forsaken喜欢数论

链接: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=1n​f(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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章