蓝桥云课 数的拆分(数论)

题目链接

觉得这个题挺好的,留个档,至于题解在题目上已经有讲的很好的了。


思路:

数学思维题。

对一个数 x x x,根据唯一分解定理可以拆成 x = p 1 k 1 ∗ p 2 k 2 ∗ p 3 k 3 ∗ ⋯ ∗ p s k s x=p_1^{k_1}*p_2^{k_2}*p_3^{k_3}*\dots *p_s^{k_s} x=p1k1p2k2p3k3psks的形式,然后我们要把这个形式转化为题目上 x = q 1 y 1 ∗ q 2 y 2 x=q_1^{y_1}*q_2^{y_2} x=q1y1q2y2 的形式。

其实比较容易发现内部的 q 1 , q 2 q_1,q_2 q1,q2 还是可以再拆的,因此 y 1 , y 2 y_1,y_2 y1,y2 我们选择尽可能小的数会比较好凑。比如说 q 6 q^6 q6 ( q 3 ) 2 (q^3)^2 (q3)2 是完全相同的,但是后者的 y = 2 y=2 y=2 就比较好凑,指数为 2 2 2 的倍数的情况显然更加常见。因此我们选择让 y 1 = 2 , y 2 = 3 y_1=2,y_2=3 y1=2,y2=3

这样,对一个质因数 p i k i p_i^{k_i} piki,我们需要 q 1 y 1 ∗ q 2 y 2 = q 1 2 ∗ q 2 3 q_1^{y_1}*q_2^{y_2}=q_1^{2}*q_2^{3} q1y1q2y2=q12q23 包含它,假设 q 1 q_1 q1 x x x p i p_i pi q 2 q_2 q2 y y y p i p_i pi,那么就有 k i = 2 ∗ x + 3 ∗ y k_i=2*x+3*y ki=2x+3y。而这个式子在 k i > 1 k_i>1 ki>1 时是总是有解的(非负整数解)。换句话说,只要 k i > 1 k_i>1 ki>1 p i k i p_i^{k_i} piki 就有办法分到 q 1 q_1 q1 q 2 q_2 q2 中去,否则就没可能。因此我们只要保证所有质因数都满足它的指数大于 1 1 1,那么就存在一种分配方案,把 x x x 可以转化为 q 1 y 1 ∗ q 2 y 2 q_1^{y_1}*q_2^{y_2} q1y1q2y2 的形式。

不过要分解质因数,我们需要筛到 1 0 18 = 1 0 9 \sqrt{10^{18}}=10^9 1018 =109 以内的质因数,预处理就会超时。而且每个数我们都要分解一下,分解的时候需要枚举质因数,质因数的个数就不能太多。

考虑到当 x x x 转化为 q 1 y 1 ∗ q 2 y 2 = q 1 2 ∗ q 2 3 q_1^{y_1}*q_2^{y_2}=q_1^{2}*q_2^{3} q1y1q2y2=q12q23 的形式时,当 q 1 = 1 q_1=1 q1=1 q 2 = 1 q_2=1 q2=1 时,这个数就是个纯粹的平方数或者立方数,直接特判就行了。

q 1 , q 2 ≠ 1 q_1,q_2\not=1 q1,q2=1 时,这个数 x x x 就至少拥有了 5 5 5 个质因数。此时除了最大的质因数,其他较小的质因数一定都满足 ≤ 1 0 18 5 ≈ 3981 \le\sqrt[5]{10^{18}}\approx 3981 51018 3981,剩下的那个较大的质因数 q q q 只有可能是 q 1 , q 2 , q 3 , q 4 q^1,q^2,q^3,q^4 q1,q2,q3,q4(再多 它的大小就小于 1 0 18 5 \sqrt[5]{10^{18}} 51018 了),除开指数是 1 1 1 的情况,其他情况就是个平方数或者立方数,可以直接特判。

code:

#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;ll prime[maxn],cnt;
bool vis[maxn];
void Eular(int n){vis[1]=true;for(int i=2;i<=n;i++){if(!vis[i])prime[++cnt]=i;for(int j=1,p=prime[1];j<=cnt && i*p<=n;p=prime[++j]){vis[i*p]=true;if(i%p==0)break;}}
}ll T,a;bool is2(ll x){ll l=1,r=x,mid;while(l<r){mid=l+r>>1;if(mid<=1e9 && mid*mid<x)l=mid+1;else r=mid;}return l*l==x;
}
bool is3(ll x){ll l=1,r=x,mid;while(l<r){mid=l+r>>1;if(mid<=1e6 && mid*mid*mid<x)l=mid+1;else r=mid;}return l*l*l==x;
}bool solve(ll a){if(is2(a) || is3(a)){return true;}for(int i=1,p=prime[1],c;i<=cnt && p<=a;p=prime[++i]){if(a%p==0){c=0;while(a%p==0){a/=p;c++;}if(c==1){return false;}}}if(is2(a) || is3(a))return true;else return false;
}int main(){Eular(5000);cin>>T;while(T--){cin>>a;puts((solve(a))?"yes":"no");}return 0;
} 

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

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

相关文章

降额的秘密——不要挑战datasheet!

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海。 什么是降额设计&#xff1f;我们为什么要降额&#xff1f; 额指的是额定工作状态&#xff0c;降额就是…

【蓝桥杯】第十五届填空题a.握手问题

题解&#xff1a; 根据问题描述&#xff0c;总共有 50 人参加会议&#xff0c;每个人除了与自己以外的其他所有人握手一次。但有 7 个人彼此之间没有进行握手&#xff0c;而与其他所有人都进行了握手。 首先&#xff0c;计算所有人进行握手的总次数&#xff1a; 总人数为 50 …

多种实现异步编程的方法

文章目录 一、线程Thread二、Future异步三、 CompletableFuture实现异步四、Spring的Async异步五、Spring ApplicationEvent事件实现异步六、消息队列七、ThreadUtil异步工具类八、Guava异步 一、线程Thread public class AsyncThread extends Thread {Overridepublic void ru…

Day19-【Java SE进阶】网络编程

一、网络编程 1.概述 可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。java.net,*包下提供了网络编程的解决方案! 基本的通信架构 基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端)。 网络通信的…

拓展企业发展新天地:低代码开发平台的策略价值

一、什么是低代码开发&#xff1f; 低代码开发平台&#xff1a;一个号称在几分钟内就能构建出一套企业内部适用的系统开发工具。低代码开发平台可以从降低开发者技术门槛、减少企业人力成本、协同共享资源、灵活搭建组件、减少bug率、按需收费等多个方面降低企业开发成本。 曾…

MVC设计模式的思想

MVC模式(Model-View-Controller) 是一种软件设计模式&#xff0c;它将应用程序分为三个部分&#xff1a;模型、视图和控制器。这个模式的目的是将应用程序的表示&#xff08;视图&#xff09;与处理&#xff08;控制器&#xff09;分开&#xff0c;以及将应用程序的数据和业务逻…

排序1——C语言

排序 1. 复杂度2. 插入排序2.1 直接插入排序2.2 希尔排序 3. 选择排序3.1 直接选择排序3.2 堆排序 排序在生活中很常见&#xff0c;比如在网购时&#xff0c;按价格排序&#xff0c;按好评数排序&#xff0c;点餐时&#xff0c;按评分排序等等。而排序有快和慢&#xff0c;快的…

洛谷 P3834 可持久化线段树 2 题解

【模板】可持久化线段树 2 题目描述 如题&#xff0c;给定 n n n 个整数构成的序列 a a a&#xff0c;将对于指定的闭区间 [ l , r ] [l, r] [l,r] 查询其区间内的第 k k k 小值。 输入格式 第一行包含两个整数&#xff0c;分别表示序列的长度 n n n 和查询的个数 m …

【磁盘清理】/var/lib/docker/overlay2 占用空间过大

找到对应的容器 1.查看目前的容器占用的空间(可略过) https://blog.csdn.net/weixin_43944305/article/details/106152976 进行简单的清理 docker system df docker system df -v docker system prune2. 查看overlay2的占用空间&#xff0c; 找到对应的容器 https://blog.c…

Navicat Premium 16 for Mac/Win:数据库管理的全能之选

在数字化时代&#xff0c;数据库管理已成为各行各业不可或缺的一环。而Navicat Premium 16作为一款功能强大的数据库管理软件&#xff0c;无疑为数据库管理员和开发者提供了高效、便捷的解决方案。 Navicat Premium 16支持多种主流数据库系统&#xff0c;无论是MySQL、Postgre…

编程新手必看,Python3编程第一步语句学习(15)

介绍&#xff1a; 在开始编写Python 3程序之前&#xff0c;有一些基本步骤和概念需要了解。以下是开始Python 3编程之旅的第一步介绍&#xff1a; 安装Python&#xff1a; 访问Python官方网站 python.org 下载适合您操作系统的Python版本&#xff08;确保选择Python 3而非Pytho…

硕士毕业论文评审老师的评审标准

硕士毕业论文评审老师的评审标准通常涉及以下几个方面&#xff1a; 工作态度与努力&#xff1a;评审老师会考察学生在毕业论文工作期间是否表现出刻苦努力、态度认真的精神&#xff0c;并且是否遵守了各项相关纪律。 任务完成情况&#xff1a;学生是否能按时、全面、独立地完成…

JS - BOM(浏览器对象模型)

BOM 浏览器对象模型 BOM可以使我们通过JS来操作浏览器 在BOM中为我们提供了一组对象&#xff0c;用来完成对浏览器的操作 BOM对象 BOM&#xff08;Browser Object Model&#xff09;是指浏览器对象模型&#xff0c;它提供了与浏览器窗口进行交互的对象和方法。BOM包括一些核…

Linux系统——Zookeeper集群

目录 一、Zookeeper概述 1.Zookeeper简介 2.Zookeeper工作机制 3.Zookeeper数据结构 4.Zookeeper应用场景 4.1统一命名服务 4.2统一配置管理 4.3统一集群管理 4.4服务器动态上下线 4.5软负载均衡 5.Zookeeper选举机制 5.1第一次启动选举机制 5.2非第一次启动选举机…

【Unity】常见性能优化

1 前言 本文将介绍下常用的Unity自带的常用优化工具&#xff0c;并介绍部分常用优化方法。都是比较基础的内容。 2 界面 2.1 Statistics窗口 可以简单查看Unity运行时的统计数据&#xff0c;当前一帧的性能数据。 2.1.1 Audio 音频相关内容。 Level&#xff1a;音量大小&a…

图机器学习导论

图&#xff1a;描述关系数据的通用语言&#xff0c;起源于哥尼斯堡七桥问题 传统的机器学习&#xff1a;数据样本之间独立同分布&#xff0c;简单拟合数据边界&#xff0c;在传统的机器学习中&#xff0c;每个数据样本彼此无关。传统的神经网络&#xff0c;只能处理简单的表格、…

实体行业的品牌传播与网络运营,迅腾文化解决完善品牌定位运营

实体行业的品牌传播与网络运营&#xff0c;迅腾文化解决完善品牌定位运营 在今日的商业环境中&#xff0c;如何借助网络的力量&#xff0c;将品牌有效地传播出去&#xff0c;让渠道商、加盟商和消费者感受到安全感&#xff0c;成为了深思的问题。品牌是一个企业的灵魂&#xf…

《青少年成长管理2024》048 “成长目标:到哪儿了?”1/2

《青少年成长管理2024》048 “成长目标&#xff1a;到哪儿了&#xff1f;”1/2 一、神奇的地球二、群居的人类三、比较而存在四、竞争与合作五、等级和秩序 本节摘要&#xff1a;当你来到这个世界&#xff0c;首先认识一下这是一个什么样的世界&#xff0c;你处于一个什么样的环…

动态规划先导片

大家知道动规是由前一个状态推导出来的&#xff0c;而贪心是局部直接选最优的&#xff0c;对于刷题来说就够用了。 对于动态规划问题&#xff0c;我将拆解为如下五步曲&#xff0c;这五步都搞清楚了&#xff0c;才能说把动态规划真的掌握了&#xff01; 确定dp数组&#xff0…

linux造成只读模式的原因和解决方法

造成硬盘分区只读的可能原因有: 文件系统错误,内核相关硬件驱动bug,FW固件类问题,磁盘坏道 硬盘背板故障,硬盘线缆故障,HBA卡故障,RAID卡故障,随意开关机系统损坏 使用用 fsck – y /dev/sda (/dev/sda指你需要修复的分区) 来修复文件系统 mount -t vfat /dev/sda1…