1494-约数研究


本文总阅读量

题目要求2N中,第二小的因数之和,这题跟筛法有什么联系呢?
当一个数第一次被划到的时候,不就是第二小因数吗?(筛法因数从小到大枚举,先被划到的必然是除1外最小的)
所以,筛法原本用0表示质数,1表示非质数。现在只要处理第一次被划到的时候,记录下因数,最后从头到尾累加第二小的因数,注意质数的值为0,直接加数本身。

for(int i = 2; i <= sqrt(n); i++){
	if(a[i]==0){
		for(int j = i*2; j <= n; j += i){
			if(a[j] == 0) a[j] = i; //首次被划到,表示第二小因数
		}
	}
}

最后扫描筛选数组。

for(int i = 2; i <= n; i++){
	if(a[i] > 0) ans += a[i];
	else ans += i;   //质数,第二小因数就是本身
}

还需要注意,答案可能会很大,需要用longlong


本站总访问量