CCF CSP题解:因子化简(202312-2)

news2024/9/25 13:21:49

链接和思路

OJ链接:传送门。

问题重述

本题基于一个基本事实,即任何一个大整数 n n n都可以唯一地分解为如下形式
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 1 , p 2 , ⋯   , p m p_1, p_2, \cdots, p_m p1,p2,,pm表示 m m m个素因子,素因子上的幂 t i > 0 ( 1 ≤ i ≤ m ) t_i > 0 (1 \le i \le m) ti>0(1im)

本题给出 q q q n , k n,k n,k,满足 1 < n ≤ 1 0 10 , 1 < k , q ≤ 10 1 < n \le 10^{10}, 1 < k, q \le 10 1<n1010,1<k,q10,要求对每组 n , k n,k n,k,求出 n n n除以所有满足 t i < k t_i<k ti<k p i t i p_i^{t_i} piti后的结果,即求出
n ∏ 1 ≤ i ≤ m 且 t i < k p i t i = ∏ 1 ≤ i ≤ m 且 t i ≥ k p i t i \frac{n}{\prod_{1 \le i \le m 且 t_i<k}p_i^{t_i}} = \prod_{1 \le i \le m 且 t_i \ge k}p_i^{t_i} 1imti<kpitin=1imtikpiti

求解思路

由于 n n n较大,求出小于 n n n的所有的素数是很困难的。因此,我们考虑使用素数筛先求出 1 0 5 10^5 105以内的所有素数。如果出现有 p i > 1 0 5 p_i>10^5 pi>105的情况,则对应的 t i t_i ti必不可能大于1,只能等于1,且这样的 p i p_i pi最多只可能有1个。常见的素数筛有埃氏筛、欧拉筛等。本文使用埃氏筛,其实现如下:

static vector<long long> primes;
// 埃拉托斯特尼筛法,时间复杂度为O(n * loglogn)
void Find_Prime_number(long long n = N){
    vector<bool> flag(n + 1, true);
    //0和1不是素数,直接初始化好
    flag[0] = 0;
    flag[1] = 0;
    //从2开始,1不是素数
    for (long long i = 2; i <= n; i++){
        //如果当前数字是素数
        if (flag[i]){
            //i的倍数标记被不是素数
            for (long long j = i * i; j <= n; j += i)
                flag[j] = false;
            primes.push_back(i);
        }
    }
}

我们将素数筛获得的所有的 1 0 5 10^5 105以内的素数保存在vector<long long> primes中。然后,将 n n n依次尝试除以primes中的每个质因子 p i p_i pi。如果能够整除 p i p_i pi的次数大于等于 k k k,则说明 p i p_i pi是“重要的”,因此恢复到尝试除以 p i p_i pi之前的值。遍历完primes后,我们再处理可能存在的大于 1 0 5 10^5 105的质因子。

上文提到,如果存在 p i > 1 0 5 p_i > 10^5 pi>105,在本题的设定中,最多只可能有1个,且对应的 t i t_i ti只可能为1,由于 k > 1 = t i k>1=t_i k>1=ti,最终答案要剔除掉 p i t i p_i ^{t_i} piti

因此,我们需要引入如下函数,用以辅助判断 n n n除以 ∏ 1 ≤ i ≤ m 且 p i ≤ 1 0 5 p i t i \prod_{1 \le i \le m 且 p_i \le 10^5}p_i^{t_i} 1impi105piti后,是否是一个大于 1 0 5 10^5 105素数。如果是,最终结果应该除以这个素数。

bool is_prime(long long n){
    for (long long i = 2; i * i <= n; i++)
        if(n % i == 0)
            return false;
    return true;
}

AC代码

满分代码如下,使用CPP 11标准即可编译运行。
在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;

const long long N = 1e5+5;

static vector<long long> primes;

// 埃拉托斯特尼筛法,时间复杂度为O(n * loglogn)
void Find_Prime_number(long long n = N){
    vector<bool> flag(n + 1, true);
    //0和1不是素数,直接初始化好
    flag[0] = 0;
    flag[1] = 0;
    //从2开始,1不是素数
    for (long long i = 2; i <= n; i++){
        //如果当前数字是素数
        if (flag[i]){
            //i的倍数标记被不是素数
            for (long long j = i * i; j <= n; j += i)
                flag[j] = false;
            primes.push_back(i);
        }
    }
}

bool is_prime(long long n){
    for (long long i = 2; i * i <= n; i++)
        if(n % i == 0)
            return false;
    return true;
}

int main() {
    Find_Prime_number();
    int q;
    cin >> q;
    while(q--) {
        long long  n;
        int k;
        cin >> n >> k;
        long long flag = n;
        for (long long prime: primes) {
            long long tmp = n;
            int cnt = 0;
            while (n % prime == 0){
                n /= prime;
                flag /= prime;
                cnt++;
            }
            if (cnt >= k)   // 如果t_i足够大,说明不需要除以p_i
                n = tmp;    // 恢复
        }
        if (flag > N && is_prime(flag)){
            // 如果存在大于N的质因子p_i,其对应的t_i=1<k,需要去除
            n /= flag;
        }
        cout << n << endl;
    }

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试 | 测试用例Ⅱ

基于需求的设计方法 测试人员接到需求后&#xff0c;要对需求进行分析和验证&#xff0c;从合理的需求中进一步分析细化需求&#xff0c;从细化的需求中找出测试点&#xff0c;根据这些测试点再去设计测试用例。 上面就是根据需求文档先设计出来的初步的测试用例&#xff0c;而…

数据库表太多,如何快速定位到需要字段

MySQL数据库表太多&#xff0c;如何快速定位到需要字段 问题&#xff1a; 数据库的表太多&#xff0c;自己只通过后端代码&#xff0c;知道数据字段名。现在想搜索数据库中所有表&#xff0c;查到对应字段&#xff0c;实现报表开发。 一、方案 在MySQL数据库中&#xff0c;如…

【web网页制作】中国传统文化书法主题html网页制作开发div+css(6页面附效果源码)

HTMLCSS传统文化主题书法网页制作 &#x1f354;涉及知识&#x1f964;写在前面&#x1f367;一、网页主题&#x1f333;二、网页效果菜单切换效果PageA、整体页Page1、主页Page2、行书页Page3、楷书页Page4、隶书页Page5、篆书页Page6、草书页 &#x1f40b;三、网页架构与技术…

微前端集成优化:让所有子应用体积更小,加载更快!

简介 随着前端的日益发展&#xff0c;微前端架构越来越受到青睐。它通过将前端应用拆分为多个独立的子应用&#xff0c;每个子应用可以独立开发、部署和运行&#xff0c;从而提升了开发效率和团队协作。目前主流的微前端方案应该是qiankun了。 以笔者公司为例&#xff0c;采用…

AI在医学领域:基础模型和视觉-语言模型在计算病理学应用概述

近年来&#xff0c;人工智能&#xff08;AI&#xff09;基于方法在计算病理学&#xff08;CPath&#xff09;领域中的应用迅速增长&#xff0c;这主要得益于数字幻灯片扫描仪的广泛采用。因此&#xff0c;大规模的全幻灯片图像&#xff08;Whole Slide Images, WSIs&#xff09…

Linux内存管理(1)——MMU内存管理单元及Buddy算法详解

文章目录 1.内存管理单元&#xff08;MMU&#xff09;1.1 MMU的作用1.2 MMU相关概念1.3 ARM处理器访问内存过程 2.内存优化之buddy伙伴算法2.1 背景2.2 优缺点2.2 原理 最近复习Linux内存管理部分&#xff0c;简单将自己的理解记录一下 内存&#xff1a;包括随机存储器&#xf…

委托 by 操作符

属性委托给属性 使用 by:: 操作符&#xff0c;代表调用系统内置的方法。 读&#xff1a;getVaule 写&#xff1a;setValue 共享同一个数据。 /*** 属性委托给属性* by:: 系统内置的方法&#xff0c;非自定义的* 共享同一个数据*/ var num:Float 9999.0f/*** newNum属性委托…

黑神话悟空-画质提升+帧数提升+超宽屏+写实画质补丁+无光追也可拥有的超强画质

超真实画质提升&#xff01;&#xff01;&#xff01; 下载地址&#xff1a;https://pan.quark.cn/s/529202fbbbef

Python | Leetcode Python题解之第381题O(1)时间插入、删除和获取随机元素-允许重复

题目&#xff1a; 题解&#xff1a; import random class RandomizedCollection:def __init__(self):"""Initialize your data structure here."""self.table {}self.ns []def insert(self, val: int) -> bool:"""Inserts …

WPF 手撸插件 七 日志记录(二)

1、本文使用Serilog进行记录日志&#xff0c;目前想只用log4net进行日志记录&#xff0c;但是Serilog有想学习一下&#xff0c;所有这里使用控制台项目来学习一下Serilog。我使用的还是.Net Framework 4.5. 2、NuGet 安装Serilog 2.12.0、Serilog.Sinks.Console 4.1.0&#xf…

智能学习辅助系统——后端部分

目录 前言 一、准备工作 1.需求&环境搭建 1.1需求说明 1.2环境搭建 2.开发规范 2.1 开发规范-REST 2.2 开发规范-统一响应结果 3.开发流程 二、部门管理 1.查询部门 &#xff08;1&#xff09;原型和需求 &#xff08;2&#xff09;接口文档 &#xff08;3&…

阿里巴巴1688 阿里228滑块 网站分析(不涉及逆向)

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…

R语言统计分析——回归模型深层次分析

参考资料&#xff1a;R语言实战【第2版】 本文主要讨论回归模型的泛化能力和变量相对重要性的方法。 1、交叉验证 从定义上看&#xff0c;回归方法就是从一堆数据中获取最优模型参数。对于OLS&#xff08;普通最小二乘&#xff09;回归&#xff0c;通过使得预测误差&#xff0…

【书生大模型实战营(暑假场)】进阶任务六 MindSearch CPU-only 版部署

进阶任务六 MindSearch CPU-only 版部署 任务文档GitHub CodeSpace硅基流动HuggingFace Space 任务&#xff1a; MindSearch 部署到Github Codespace 和 Hugging Face Space 笔者部署在 HuggingFace 的 MindSearch 模型链接为&#xff1a;ccdgyro/MindSearch 1 开发机创建和环…

重塑视频监控体验:WebRTC技术如何赋能智慧工厂视频高效管理场景

视频汇聚EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。 EasyCVR平台不仅兼容多种主流标准协议及私有协议/SDK的接入&#xff08;如&…

汽车线束品牌服务商推荐-力可欣:致力于汽车连接线束和汽车连接器的开发、生产和应用

汽车线束品牌服务商推荐-力可欣&#xff1a;致力于汽车连接线束和汽车连接器的开发、生产和应用

医院建筑的电气设计——保障医疗质量与安全的坚固基石

医疗资源与水平的提升成为了衡量民生福祉的重要标尺。随着一批批新建医院及既有医院的华丽蜕变&#xff0c;从社区医院到综合医院&#xff0c;再到医疗城、医疗集聚区的崛起&#xff0c;不仅彰显了政府对民生健康的深切关怀&#xff0c;也预示着我国医疗体系正迈向智能化、高效…

C++初学(17)

17.1、字符函数库cctype C有一个与字符相关的、非常方便的函数软件包&#xff0c;它可以简化如确定字符是否为大写字母、数字或标点符号等工作。这些函数的原型是在头文件cctype中定义的。如果ch是一个字母&#xff0c;则isalpha(ch)函数返回一个非零值&#xff0c;否则返回0。…

关于zotero无法识别拖入的pdf和caj的题录信息

一、首先要安装好茉莉花插件 1、点击链接&#xff0c;进入Zotero 插件商店&#xff0c; Zotero 插件商店 | Zotero 中文社区 (zotero-chinese.com) 搜索&#xff1a;Jasminum&#xff0c;选择好版本&#xff0c;点击下载 2、 下载好后&#xff0c;点击“工具”&#xff0c;…

兔子序列(c语言)

1.//描述 //兔子发现了一个数字序列&#xff0c;于是开始研究这个序列。兔子觉得一个序列应该需要有一个命名&#xff0c; // 命名应该要与这个序列有关。由于兔子十分讨厌完全平方数&#xff0c; // 所以兔子开创了一个新的命名方式&#xff1a;这个序列中最大的不是完全平方数…