最小质因子之和

题目描述

定义 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标记为素数
                }
            }
        }
    }
}

 

相关推荐

  1. 因子之和

    2023-12-21 13:26:01       36 阅读
  2. 【现代控制系统】实现与互分式

    2023-12-21 13:26:01       28 阅读
  3. 大N个数与N个数之和

    2023-12-21 13:26:01       6 阅读
  4. C++知识点总结(11):因子分解

    2023-12-21 13:26:01       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-21 13:26:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-21 13:26:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-21 13:26:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-21 13:26:01       18 阅读

热门阅读

  1. 记录 | 源码编译Arm CPU版FFmpeg

    2023-12-21 13:26:01       46 阅读
  2. Python爬虫山东重庆各地区天气预报

    2023-12-21 13:26:01       37 阅读
  3. 在国产GPU寒武纪MLU上快速上手Pytorch使用指南

    2023-12-21 13:26:01       49 阅读
  4. Ubuntu Docker图形界面实现

    2023-12-21 13:26:01       40 阅读
  5. C++高级:深拷贝与浅拷贝在嵌入式系统中的应用

    2023-12-21 13:26:01       41 阅读
  6. uni-app 微信小程序蓝牙模块的解耦封装-持续更新

    2023-12-21 13:26:01       32 阅读
  7. 速盾网络:网络安全守护者

    2023-12-21 13:26:01       45 阅读
  8. SpringBoot缓存注解@Cacheable使用姿势介绍

    2023-12-21 13:26:01       42 阅读
  9. 算法:从入门到变通

    2023-12-21 13:26:01       40 阅读
  10. 面试算法63:替换单词

    2023-12-21 13:26:01       39 阅读
  11. 在spring boot项目引入mybatis plus后的的案例实践

    2023-12-21 13:26:01       44 阅读