CCF-CSP 202312-2 因子化简(Java、C++、Python)

文章目录

  • 因子化简
    • 题目背景
    • 问题描述
    • 输入格式
    • 输出格式
    • 样例输入
    • 样例输出
    • 样例解释
    • 子任务
  • 满分代码
    • Java
    • C++
    • Python
    • 线性筛法

因子化简

题目背景

质数(又称“素数”)是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。

问题描述

P 同学在学习了素数的概念后得知,任意的正整数 n n n 都可以唯一地表示为若干素因子相乘的形式。如果正整数 n n n m m m 个不同的素数因子 p 1 , p 2 , ⋯   , p m p_1,p_2,\cdots,p_m p1,p2,,pm,则可以表示为: n = p 1 t 1 × p 2 t 2 × ⋯ × p m t m n=p_1^{t_1}\times p_2^{t_2}\times\cdots\times p_m^{t_m} n=p1t1×p2t2××pmtm

小 P 认为,每个素因子对应的指数 t i t_i ti 反映了该素因子对于 n n n 的重要程度。现设定一个阈值 k k k,如果某个素因子 p i p_i pi 对应的指数 t i t_i ti 小于 k k k,则认为该素因子不重要,可以将 p i t i p_i^{t_i} piti 项从 n n n 中除去;反之则将 p i t i p_i^{t_i} piti 项保留。最终刺余项的乘积就是 n n n 简化后的值,如果没有剩余项则认为简化后的值等于 1

试编写程序处理 q q q 个查询:

  • 每个查询包含两个正整数 n n n k k k,要求计算按上述方法将 n n n 简化后的值。

输入格式

从标准输入读入数据。

输入共 q + 1 q+1 q+1 行。

输入第一行包含一个正整数 q q q,表示查询的个数。

接下来 q q q 行每行包含两个正整数 n n n k k k,表示一个查询。

输出格式

输出到标准输出。

输出共 q q q 行。

每行输出一个正整数,表示对应查询的结果。

样例输入

3
2155895064 3
2 2
10000000000 10

样例输出

2238728
1
10000000000

样例解释

查询一:

  • n = 2 3 × 3 2 × 2 3 4 × 107 n=2^3\times3^2\times23^4\times107 n=23×32×234×107
  • 其中素因子 3 指数为 2, 107 指数为 1。将这两项从 n n n 中除去后,剩余项的乘积为 2 3 × 2 3 4 = 2238728 2^3\times23^4=2238728 23×234=2238728

查询二:

  • 所有项均被除去。输出 1

查询三:

  • 所有项均保留,将 n n n 原样输出。

子任务

40% 的测试数据满足: n ≤ 1000 n\leq1000 n1000

80% 的测试数据满足: n ≤ 1 0 5 n\leq10^5 n105

全部的测试数据满足 : 1 < n ≤ 1 0 10 :1<n\leq10^{10} :1<n1010 1 < k , q ≤ 10 1<k,q\leq10 1<k,q10

满分代码

注意到: 对于 n n n,仅有一个最大素因子 m m m 可能大于 n \sqrt n n ,也就是说我们只需要除去 2 ∼ n 2 \sim \sqrt n 2n 的素因子就可以得到 m m m,所以对于全部数据 n ≤ 1 0 10 n \leq 10^{10} n1010,我们只需要求出 2 ∼ 1 0 5 2 \sim 10^5 2105 中所有质数即可,直接用试除法,稍微优化一下时间复杂度也就 1 0 7 10^7 107,可以通过,如果数据 n ≤ 1 0 14 n\leq10^{14} n1014 就需要使用线性筛法了。

在这里插入图片描述

Java

import java.util.*;
import java.io.*;

public class Main {
    static QuickInput in = new QuickInput();
    static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    static int max = 100007;

    public static void main(String[] args) throws IOException {
        long q = in.nextLong();
        List<Integer> list = new ArrayList<>();
        for (int i = 2; i < max; i++) check(i, list);
        for (int i = 0; i < q; i++) {
            long n = in.nextLong(), k = in.nextLong();
            long ans = n;
            int[] cnt = new int[max];
            for (int j : list) {
                if (n == 1) break;
                while (n % j == 0) {
                    n /= j;
                    cnt[j]++;
                }
            }

            ans /= n;
            for (int j = 0; j < max; j++) {
                if (cnt[j] < k && cnt[j] != 0) {
                    ans /= Math.pow(j, cnt[j]);
                }
            }

            out.println(ans);
        }
        out.flush();
    }

    static void check(int n, List<Integer> list) {
        for (int i : list) {
            if (i * i > n) break;
            if (n % i == 0) return;
        }
        list.add(n);
    }

    static class QuickInput {
        StreamTokenizer input = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        long nextLong() throws IOException {
            input.nextToken();
            return (long) input.nval;
        }
    }
}

C++

#include<bits/stdc++.h>
using namespace std;

const int max_val = 1e5;

void check(int n, vector<int>& list) {
    for (int i : list) {
    	if (i * i > n) break;
        if (n % i == 0) return;
    }
    list.push_back(n);
}

int main() {
	ios::sync_with_stdio(false);
    cin.tie(0);
    
    int max = max_val;
    long long q;
    cin >> q;

    vector<int> primeList;
    for (int i = 2; i < max; i++) {
        check(i, primeList);
    }

    for (int i = 0; i < q; i++) {
        long long n, k;
        cin >> n >> k;
        long long ans = n;
        vector<int> cnt(max_val, 0);

        for (int j : primeList) {
            if (n == 1) break;
            while (n % j == 0) {
                n /= j;
                cnt[j]++;
            }
        }

        ans /= n;
        for (int j = 0; j < max_val; j++) {
            if (cnt[j] < k && cnt[j] != 0) {
                ans /= pow(j, cnt[j]);
            }
        }

        cout << ans << endl;
    }
    
    return 0;
}

Python

max_val = 100000
primes = []
for i in range(2, max_val):
    if all(i % p != 0 for p in primes if p * p <= i):
        primes.append(i)

q = int(input())
for _ in range(q):
    n, k = map(int, input().split())
    ans = n
    cnt = [0] * max_val
    for prime in primes:
        while n % prime == 0:
            n //= prime
            cnt[prime] += 1

    ans //= n
    for prime, t in enumerate(cnt):
        if t < k and t != 0:
            ans //= pow(prime, t)

    print(ans)

线性筛法

max_val = 100000
is_prime = [True] * (max_val + 1)
primes = []

for i in range(2, max_val + 1):
    if is_prime[i]:
        primes.append(i)

    for j in range(len(primes)):
        if i * primes[j] > max_val:
            break
        is_prime[i * primes[j]] = False

        if i % primes[j] == 0:
            break

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/359524.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

房屋租赁系统-java

思维导图&#xff1a;业务逻辑 类的存放&#xff1a; 工具类 Utility package study.houserent.util; import java.util.*; /***/ public class Utility {//静态属性。。。private static Scanner scanner new Scanner(System.in);/*** 功能&#xff1a;读取键盘输入的一个菜单…

DevOps落地笔记-02|影响地图:产品规划和需求分析的利器

从这一讲开始&#xff0c;我们进入 DevOps 正题。按照端到端的顺序&#xff0c;讲解 DevOps 中的最佳实践如何在软件开发过程中发挥作用。所谓端到端&#xff0c;是指从需求提出到需求被发布到生产环境交付给用户的整个过程&#xff0c;可以理解为软件开发的全生命周期。所谓最…

06 SB3之Thymeleaf实现视图返回

1快速尝试一个返回视图的项目 1.1创建器添加Web, Thymeleaf, lombok依赖创建项目 1.2 编写Controller Controller public class QuickController {RequestMapping("/exam/quick") public String quick(Model model){//业务处理结果数据&#xff0c;放入到 Model 模…

【lesson1】高并发内存池项目介绍

文章目录 这个项目做的是什么&#xff1f;这个项目的要求的知识储备和难度&#xff1f;什么是内存池池化技术内存池内存池主要解决的问题malloc 这个项目做的是什么&#xff1f; 当前项目是实现一个高并发的内存池&#xff0c;他的原型是google的一个开源项目tcmalloc&#xf…

万户 ezOFFICE SendFileCheckTemplateEdit.jsp SQL注入漏洞

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

Redis内存设置

通过redis-cli进入Redis命令行 redis权限认证命令&#xff1a;auth 查看redis内存使用情况的命令&#xff1a;info memory 查看最大内存命令&#xff1a;config get maxmemory 设置最大内存命令&#xff1a;config set maxmemory 也可以通过redis.conf配置文件修改最大内存…

MicroPython核心:映射和字典

MicroPython字典和映射使用称为开放寻址和线性探测的技术&#xff0c;本文详细介绍了这两种方法。 开放寻址 开放寻址用于解决碰撞问题&#xff0c;碰撞是非常常见的现象&#xff0c;当两个条目恰好散列到同一个槽或位置时就会发生碰撞。例如&#xff0c;散列设置如下&#x…

计算机基础知识讲解(原码反码补码)(以及在C语言里面是如何计算和运用的)

补码反码掩码以及原理 补码、反码和掩码是计算机科学中用于表示和处理数值的三种编码方式。 原码 原码是最直观的数值表示方法&#xff0c;它将数值的二进制表示与其符号位结合起来。在原码表示中&#xff0c;正数的符号位为0&#xff0c;而负数的符号位为1。原码的缺点在于…

【pytorch】nn.linear 中为什么是y=xA^T+b

我记得读教材的时候是yWxb, 左乘矩阵W&#xff0c;这样才能表示线性变化。 但是pytorch中的nn.linear中&#xff0c;计算方式是yxA^Tb&#xff0c;其中A是权重矩阵。 为什么右乘也能表示线性变化操作呢&#xff1f;因为pytorch中&#xff0c;照顾到输入是多个样本一起算的&…

比Filebeat更强大的日志收集工具-Fluent bit的http插件实战

文章目录 1.前言2. fluent bit http插件配置以及参数详解3. Http 接口服务3.1 开发Http 接口服务3.2 重启fluent bit向http web服务发送数据 1.前言 Fluent Bit 的 HTTP 插件提供了一种灵活而通用的机制&#xff0c;可用于将日志数据 从各种环境中传输到指定的远程服务器&#…

C++_list

目录 一、模拟实现list 1、list的基本结构 2、迭代器封装 2.1 正向迭代器 2.2 反向迭代器 3、指定位置插入 4、指定位置删除 5、结语 前言&#xff1a; list是STL(标准模板库)中的八大容器之一&#xff0c;而STL属于C标准库的一部分&#xff0c;因此在C中可以直接使用…

TestNG中的DataProviders(@DataProvider annotation)

目录 什么是数据提供者&#xff1f; 数据提供程序及其返回的内容 DataProvider语法 DataProvider注释的方法可以返回什么&#xff1f; 使用数据提供程序的测试用例 如何在测试用例中使用数据提供程序&#xff1f; 其他类中的数据提供程序 在DataProvider带注释的方法中…

深度强化学习(王树森)笔记11

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

植物病害检测YOLOV8,OPENCV调用

【免费】植物病害检测&#xff0c;10种类型&#xff0c;YOLOV8训练&#xff0c;转换成ONNX&#xff0c;OPENCV调用资源-CSDN文库 植物病害检测&#xff0c;YOLOV8NANO&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;支持C,PYTH…

算法——线性代数——逆序数奇偶

一、逆序数奇偶 分析&#xff1a; 概念&#xff1a; 求一个排列的逆序数奇偶性有两种方法&#xff0c;一种是从前往后遍历数组&#xff0c;另一种是从后往前遍历数组从前往后时&#xff0c;当前数字前面大于它的数字的个数即为它的逆序数个数从后往前时&#xff0c;当前数字前…

Docker的使用方式

一、Docker概念 Docker类似于一个轻量的虚拟机。 容器和镜像是Docker中最重要的两个概念&#xff0c;镜像可以保存为tar文件&#xff0c;Dockerfile是配置文件&#xff0c;仓库保存了很多第三方已经做好的镜像。 基本指令 查找镜像 docker search nginx 拉取nginx镜像 do…

Yalmip学习笔记

这里写自定义目录标题 基本用法变量定义关于大MBilevel programming 注&#xff1a;这篇文章主要是留给自己查漏补缺的&#xff0c;所以从来没有使用过yalmip的读者看着会觉得跳来跳去。 基本用法 建模开始前&#xff0c;使用yalmip(clear)清空Yalmip的内部数据库。 下面是一个…

少儿编程教育:培养未来创新者

在这个数字化飞速发展的时代&#xff0c;编程已经成为了一门新的通用语言。随着科技的不断进步&#xff0c;编程教育正逐渐从高等教育领域向中小学乃至幼儿园渗透。6547网认为少儿编程不仅是一种技能的培养&#xff0c;更是对孩子们逻辑思维、解决问题能力和创造力的锻炼。图形…

Spring 中获取 Bean 对象的三种方式

目录 1、根据名称获取Bean 2、根据Bean类型获取Bean 3、根据 Bean 名称 Bean 类型来获取 Bean&#xff08;好的解决方法&#xff09; 假设 Bean 对象是 User&#xff0c;并存储到 Spring 中&#xff0c;注册到 xml 文件中 public class User {public String sayHi(){retur…

Mac安装及配置MySql及图形化工具MySQLworkbench安装

Mac下载配置MySql mysql下载及安装 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 根据自己电脑确定下载x86还是ARM版本的 如果不确定&#xff0c;可以查看自己电脑版本&#xff0c;终端输入命令 uname -a 点击Download下载&#xff0c;可跳过登录注册&…