最小质因子之和
2023-12-21 11:23:54
题目描述
定义?F(i)?表示整数?i?的最小质因子。现给定一个正整数?N,请你求出 2-n的F(i)之和。
输入描述
第?1?行为一个整数?T,表示测试数据数量。
接下来的?T?行每行包含一个正整数?N。
1≤T≤1e6,2≤N≤3e6。
输出描述
输出共?T?行,每行包含一个整数,表示答案。
输入输出样例
示例 1
输入
3
5
10
15
输出
12
28
59
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 1s | 256M |
C | 1s | 256M |
Java | 2s | 256M |
Python3 | 6s | 256M |
PyPy3 | 6s | 256M |
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
/**
* ClassName: LanQiao1151
* pACKAGE: NumTheory
* Description:
* 最小质因子之和:埃氏筛
* @Author hz
* @Create: 2023/9/7 - 21:44
* @Version :v1.0
*/
public class LanQiao1151 {
public static void main(String[] args) throws IOException {
//预处理
f();
sum();
StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
sc.nextToken();
int t = (int) sc.nval;
while (t-- > 0) {// 1e6
sc.nextToken();
int n = (int) sc.nval;
System.out.println(sum[n]);
}
}
static long[] sum = new long[4000000];
/**
* 求pre数组的前缀和以便后面直接计算 减少时间复杂度
*/
private static void sum() {
for (int i = 2; i < pre.length; i++) sum[i] = sum[i - 1] + pre[i];
}
/**
* 埃氏筛法:整个算法时间复杂度:o(n*sqrt(n)) 1e9
* 如何求1-n之间的素数: 素数标记为0,即一个数i如果是素数则book[i]=0,那么它的倍数都标记为合数即book[i*j]=1
* <p>
* 如何在这个过程中求每个数的最小质因子:在埃氏筛中一个数可能会被筛掉多次,但如果他第一次是被x筛掉的则x是它的最小质因子
* 例如6 会被2和3筛掉,那么2就是它的最小质因子
*/
static int[] book = new int[4000000];//判断下标对应的数是不是素数 是素数的话存放0
static int[] pre = new int[4000000];//存放下标对应的数的最小质因子
private static void f() {
book[0] = 1;
book[1] = 1;// 0和1是合数所以存的是1
for (int i = 2; i < book.length; i++) {
if (book[i] == 0) {//如果下标i对应的数是素数
pre[i] = i;//则i的最小质因子就是它本身
for (int j =2; i*j < book.length ;j++) {
if (book[i*j] == 0) {//若此时j没有被标记为合数,那么j会被i消去,i是第一个消去j的因子,
//那么i也就是j对应的最小的那个素因子
pre[i*j] = i;//记录j最小的素因子是i
//System.out.println(j + " " + i);
}
book[i*j] = 1;//把j标记为素数
}
}
}
}
}
?
文章来源:https://blog.csdn.net/weixin_68739334/article/details/132775671
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!