版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
筛素数
const int MAXN = 1e7+10;
bool isp[MAXN]; int su[MAXN]; // su 比 MAXN 小一个数量级合适
void Euler ( int MAXN ) {
register int tot = 0;
memset( isp, true, sizeof(isp) ), isp[0] = false, isp[1]= false;
memset( su, 0, sizeof(su) );
for ( register int i = 2; i <= MAXN; ++i ) {
if ( isp[i] ) su[tot++] = i;
for ( register int j = 0; j<tot&&i*su[j]<=MAXN; ++j ) {
isp[i*su[j]] = false;
if ( !(i%su[j]) ) break;
}
}
}
筛最小质因子
const int MAXN = 3e7+10;
int minFactor[MAXN]; int su[MAXN]; // su 比 MAXN 小一个数量级合适
void Euler ( int MAXN ) {
register int tot = 0;
memset( minFactor, 0, sizeof(minFactor) ); // 0 和 1 最小质因子作为0
memset( su, 0, sizeof(su) );
for ( register int i = 2; i <= MAXN; ++i ) {
if ( !minFactor[i] ) su[tot++] = i, minFactor[i] = i;
for ( register int j = 0; j<tot&&i*su[j]<=MAXN; ++j ) {
minFactor[i*su[j]] = su[j];
if ( !(i%su[j]) ) break;
}
}
}
如题目所求, 求 n 个数字的最小质因子之和, 只需要对前 n 个数字加和 minFactor 即可