最小质因数相加——素数筛
Forsaken喜欢数论
https://ac.nowcoder.com/acm/problem/53079
寻找1-n最小的质因数相加,最直接的暴力就是从素数表中找到最小因数,联想到素数筛的过程可以直接找到最小质因数。
这里要注意的点是:理论上3e7是不会爆int的,但是在for(long long j=ii;j<=n;j+=i)这句中,ii会爆int,导致出错。
#include<iostream> #include<math.h> using namespace std; int a[(int)3e7+5]; int main() { int n; cin>>n; long long cnt=0; for(long long i=2;i<=n;i++) { if(!a[i]) { cnt+=i; for(long long j=i*i;j<=n;j+=i) { if(!a[j]) { cnt+=i; a[j]=1; } } } } cout<<cnt<<endl; getchar(); getchar(); }