最小质因子,有埃式筛,但是埃式筛时间复杂度太高,用线性筛
线性筛是埃式筛的优化,减少了重复赋值,就是改变了顺序。
//package com.js.datastructure.recursion.蓝桥;
import java.util.ArrayList;
//import java.util.Collection;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//先求最小质因子,再求前缀和
long[] minp = new long[20000001];
//minp[1] = 1;
ArrayList<Integer> p = new ArrayList<>(); //存放质数
for (int i = 2; i < 20000001; i++) {
if(minp[i] == 0){
p.add(i);
minp[i] = i;
}
for (int pp : p) {
if(i * pp >= 20000001){
break;
}
minp[i * pp] = pp;
if(minp[i] == pp){
break;
}
}
}
//求前缀和
for (int i = 2; i <= 20000000; i++) {
minp[i] = minp[i-1] + minp[i];
}
int t = scanner.nextInt();
//测试数据得出
for (int i = 0; i < t; i++) {
int n = scanner.nextInt();
System.out.println(minp[n]);
}
}
}