【CCF CSP】202312-2 因子化简(C/C++解题思路+满分题解)

解题思路

80分思路+代码

        由于题目在数据规模中说明阈值k > 1, 因此提取因式时只需要关注次数在二次以上的因式。也就是说,我们只需要判断从1到待化简因式的平方根是否是满足题意的因式即可。举个例子,假设题目所给因式是10000,那么只需要判断从1到\sqrt{10000} = 100内是否存在10000的质因式即可,因为大于100的质因式一定会被舍去。

        再观察数据规模,如果输入的因式小于1*10^4,那么只需要判断从1到100的质因式即可。小学老师应该要求背过从1到100的质数吧,现在就派上用场了。

        首先读入查询组数, 定义待处理因式n, 阈值k和输出值output。定义一个质因数数集保存从1到101的27个质因数。定义一个哈希数组保存从1到100质因数的指数,并且在每次循环初始化哈希数组。

int q;
cin >> q;int n, k, output;
int arr[27] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,87,93,97,101};
int temp[102];for(int i = 0; i < q; i++)
{memset(temp, 0, sizeof(int)*102);output = 1;cin >> n >> k;
...

        循环判断从1到101(为了保险)的27个质因数是否能整除待处理因式n。如果其中一个因数能整除待处理因式,那么将该因式从待处理因式分离并在哈希数组中记录该质因数的指数变化。并且继续判断该因数能否被整除,直到出现余数。

        此时需要看该质因数的指数是否达到阈值。如果达到,将相应次数的质因数与输出output相乘。当待处理因式只剩下1的时候,退出循环,输出output。

for(int j = 0; j < 27; )
{if(n % (arr[j]) == 0){n = n / arr[j];   //分离因式temp[arr[j]]++;   //记录指数continue;         //继续看该质因数能否被整除}if(temp[arr[j]] >= k)output *= pow(arr[j], temp[arr[j]]);if(n == 1)break;j++;
}
cout << output << endl;

80分完整代码如下(其实80分的数据规模达到10^5,理论上以下代码只能保证10^4规模的输出(质数只取到101),但是官方好像并没有相应的极端数据)

#include <iostream>
#include <math.h>
#include <string.h>using namespace std;int main()
{int q, n, k, output;int temp[102];int arr[27] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,87,93,97,101};cin >> q;for(int i = 0; i < q; i++){output = 1;memset(temp, 0, sizeof(int)*102);cin >> n >> k;for(int j = 0; j < 27; ){if(n % (arr[j]) == 0){n = n / arr[j];   //分离因式temp[arr[j]]++;   //记录指数continue;         //继续看该质因数能否被整除}if(temp[arr[j]] >= k)output *= pow(arr[j], temp[arr[j]]);if(n == 1)break;j++;}cout << output << endl;}return 0;
}

100分思路加代码

        有了80分的代码做基础,其实100分的代码只需要再做一件事:把大于1*10^4的数分解为若干个小于1*10^4的数相乘,再沿用80分代码分别判断即可。

        首先注意数据规模,1*10^10的数据需要用长整型long long表示,需要把输入输出数据类型都改为long long,并且重新定义一个更长的哈希数组存放指数。

typedef long long LL;
int longtp[10002];
LL n, output;

        定义一个返回因数集合的函数divide,将10^5以上的数进行分解,只需判断是否存在10^5以下的因数,并分离即可(加入son集合),如果source已经小于10000,说明已经可以按照80分代码逻辑处理。

multiset<int> divide(LL source)
{multiset<int> son;for(int j = 2; j < 10001;){if(source < 10000){son.insert(source);break;}if(source % j == 0){source = source / j;son.insert(j);//cout << j << endl;continue;}j++;}return son;
}

        封装80分代码处理10^4以内数据的流程为无返回值函数cal。除了更换变量名称外,需要注意,80分代码可以丢掉小于阈值的指数,100分代码则不行;80分代码在处理到最后发现没有100以上质因数后直接丢掉剩下的质数,而100分代码需要保留剩下的质数。

        因为son集合其他成员分离出来的相同质因数的质数可以叠加。比如说102981488 = 23*(46^4); 如果在处理23时认为质因数23的质数小于1后丢掉,这个指数1就不能和后面(46^4)叠加了。

void cal(int num)
{for(int j = 0; j < 27;){if(num == 1)break;if(num % (arr[j]) == 0){num = num / arr[j];longtp[arr[j]]++;continue;}                       //这里不需要判断指数是否大于阈值j++;if(j == 27)longtp[num]++;      //最后剩下的大于100的质数不能扔}
}

         由此,计算输出需要统一放到最后进行,一次读取所有指数并进行相应乘法运算。

multiset<int> division;   
division = divide(n);     //分离后的因式
memset(longtp, 0, sizeof(int)*10002);   //每次都要初始化所有指数为0
for(auto it = division.begin(); it != division.end(); it++)
{cal(*it);             //计算所有因式
}
for(int j = 2; j < 10001; j++)  //统一判断阈值
{if(longtp[j] >= k)output *= pow(j, longtp[j]);
}

完整代码如下

#include <iostream>
#include <math.h>
#include <algorithm>
#include <string.h>
#include <set>using namespace std;typedef long long LL;
int longtp[10002];
int arr[27] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,87,93,97,101};multiset<int> divide(LL source)
{multiset<int> son;for(int j = 2; j < 10001;){if(source < 10000){son.insert(source);break;}if(source % j == 0){source = source / j;son.insert(j);continue;}j++;}return son;
}void cal(int num)
{for(int j = 0; j < 27;){if(num == 1)break;if(num % (arr[j]) == 0){num = num / arr[j];longtp[arr[j]]++;continue;}						//这里不需要判断指数是否大于阈值j++;if(j == 27)longtp[num]++;		//最后剩下的大于100的质数不能扔}
}int main()
{int q, k;LL n, output;int temp[102];cin >> q;for(int i = 0; i < q; i++){output = 1;cin >> n >> k;if(n > 10000){multiset<int> division; 				//分离后的因式division = divide(n);memset(longtp, 0, sizeof(int)*10002);	//每次都要初始化所有指数为0for(auto it = division.begin(); it != division.end(); it++)cal(*it);							//计算所有因式for(int j = 2; j < 10001; j++)			//统一判断阈值if(longtp[j] >= k)output *= pow(j, longtp[j]);}else{memset(temp, 0, sizeof(int)*102);for(int j = 0; j < 27; ){if(n % (arr[j]) == 0){n = n / arr[j];temp[arr[j]]++;continue;}if(temp[arr[j]] >= k)output *= pow(arr[j], temp[arr[j]]);if(n == 1)break;j++;}}cout << output << endl;}return 0;
}

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

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

相关文章

docker 限制ip访问端口

需求限制外网访问 docker的某个服务 经过查找 发现 ubuntu的 ufw 防火墙是无效的 技术交流http://idea.coderyj.com/ 1.查看docker的 路由 iptables --line -nvL DOCKER-USER默认是允许所有的访问不限制 2.添加限制规则 iptables 是从上往下匹配的所以我们限制规则要在第一条 …

格密码与线性代数

目录 一. 幺模矩阵 二. Gram-Schmidt 正交化 三. 矩阵分解 四. 格基本区 五. 对偶格基 六. 矩阵伪逆 七. 正定矩阵 八. 矩阵转置 九. 奇异值分解&#xff08;SVD分解&#xff09; 格密码中格基是矩阵&#xff0c;格点是向量。本文章梳理一些格密码常用到的一些线性代数…

Unity 如何通过2D Sprite切割一张图为多张

1、理解 在一些2D游戏开发中&#xff0c;我们常常使用2D Sprite把一张大图切割成多个小图使用。 这样做有不少好处&#xff0c;首先&#xff0c;通过精准使用小图&#xff0c;能够一定程度上节省内存&#xff0c;提高渲染性能。 其次把同类的小图做成一张大图在切割使用会更…

ElasticSearch详细搭建以及常见错误high disk watermark [ES系列] - 第497篇

导读 历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六…

Java毕业设计——基于SpringBoot的健身房管理系统

1&#xff0c;项目背景 随着人们生活水平的提高和健康意识的增强&#xff0c;健身行业逐渐兴起并迅速发展。而现代化的健身房管理系统已经成为健身房发展的必备工具之一。传统的健身房管理方式已经无法满足现代化健身房的需求&#xff0c;需要一种更加高效、智能、安全的管理系…

HamronyOS 自动化测试框架使用指南

概述 为支撑 HarmonyOS 操作系统的自动化测试活动开展&#xff0c;我们提供了支持 JS/TS 语言的单元及 UI 测试框架&#xff0c;支持开发者针对应用接口进行单元测试&#xff0c;并且可基于 UI 操作进行 UI 自动化脚本的编写。 本指南重点介绍自动化测试框架的主要功能&#x…

欧非源国际交易平台在2023中非经济贸易大湾区论坛首次亮相

12月16日&#xff0c;2023中非经济贸易大湾区论坛在鹏城隆重召开&#xff0c;欧非源国际交易平台首次亮相。来自非洲部分国家的驻华使节、中非经济贸易委员会领导以及商&#xff08;协&#xff09;会、企业家代表共同见证了欧非源国际交易平台的发布&#xff0c;亲历了该平台与…

机器学习 | 线性算法 —— 大禹治水

Machine-Learning: 《机器学习必修课&#xff1a;经典算法与Python实战》配套代码 - Gitee.com 如果说KNN算法体现了人们对空间距离的理解&#xff0c; 那么线性算法则体现了人们对事物趋势上的认识。 注意图中横纵坐标的不同。 线性回归、多项式回归多用于预测&#xff0c;逻辑…

Manacher算法(马拉车)

Manacher&#xff08;马拉车&#xff09;算法 作用&#xff1a;在On的时间复杂度下&#xff0c;求出字符串每个回文中心的最长回文半径 回文半径&#xff1a;以回文中心为起点&#xff0c;到回文串两端的距离 如&#xff1a;# a # b # a # 以b为回文中心&#xff0c;最长回文半…

Springboot+Mybatis入门案例

一、项目结构 1.导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apach…

实现基于 Keepalived 和 Nginx 的高可用架构

目录 前言1 高可用性简介2 准备服务器和软件3 高可用的配置&#xff08;主从配置&#xff09;3.1 配置/etc/keepalived/keepalived.conf文件3.2 配置/usr/local/src/nginx_check.sh脚本文件 4 启动软件5 测试结语 前言 在现代互联网架构中&#xff0c;高可用性是至关重要的。N…

<九>JavaScript中的基本数据类型和引用数据类型

一、栈内存和堆内存 基本数据类型&#xff08;值类型&#xff09;存放在“栈内存”中。引用数据类型&#xff08;对象类型&#xff09;存放在“堆内存”中。栈内存和堆内存是一种对内存的管理方式和模型概念&#xff0c;不存在物理分割。 “栈”具有线程和“先进后出”的特点…

GBJ2510-ASEMI逆变器专用整流桥GBJ2510

编辑&#xff1a;ll GBJ2510-ASEMI逆变器专用整流桥GBJ2510 型号&#xff1a;GBJ2510 品牌&#xff1a;ASEMI 封装&#xff1a;GBJ-4 最大平均正向电流&#xff1a;25A 最大重复峰值反向电压&#xff1a;1000V 产品引线数量&#xff1a;4 产品内部芯片个数&#xff1a;…

基于ssm防疫信息登记系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本防疫信息登记系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

配置https环境

为什么要配置https环境 在使用 HTML5 的 API 时&#xff0c;很多 API 只能在 https 保证安全的情况下才能开启。这就要求我们在本地开发环境也能够配置 https&#xff0c;否则你需要每次部署到配有 https 的测试环境中才能看到预览效果&#xff0c;这对开发的敏捷度造成了极大…

网络空间搜索引擎- FOFA的使用技巧总结

简介 FOFA是一款网络空间测绘的搜索引擎&#xff0c;旨在帮助用户以搜索的方式查找公网上的互联网资产。 FOFA的查询方式类似于谷歌或百度&#xff0c;用户可以输入关键词来匹配包含该关键词的数据。不同的是&#xff0c;这些数据不仅包括像谷歌或百度一样的网页&#xff0c;还…

AI语音电话机器人识别技术声音合成声音是怎么实现的

AI语音识别技术的声音合成是通过将文本转换为声音信号的过程实现的。这个过程包含以下步骤&#xff1a; 文本分析和处理&#xff1a;首先&#xff0c;输入的文本会接受分析和处理。这可能涉及到词法分析、语法分析和语义分析等技术&#xff0c;用于理解文本的含义和上下文。 …

【Mybatis】日常知识点随笔(持续更新)

目录 【K】Mybatis使用Select注解书写简单sql 【K】MySQL 数据类型与 Java 类型的对应关系 【K】Mybatis相同代码复用 1. 定义公共 SQL 片段 2. 引用公共 SQL 片段 3. 使用参数 4. 复用和组合 5. 注意事项 【K】mysql如何实现插入一条数据后立刻获取该数据自增长id进行…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)更改应用图标

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;更改应用图标 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、更改图标 图标的位置&#xff1a;entry->src->main->resources->-b…

智慧校园2.0物联网管理平台建设方案:PPT全文22页,附下载

关键词&#xff1a;物联网解决方案&#xff0c;智慧校园解决方案&#xff0c;物联网平台建设方案&#xff0c;物联网应用技术 一、智慧校园2.0物联网管理平台建设背景 1、教育现代化和强国建设的需要&#xff1a;近年来&#xff0c;国家为了加快推进教育现代化、教育强国建设…