CSDN每日一练:寻因找祖

news2025/5/26 0:44:02

题目名称:寻因找祖
时间限制:1000ms内存限制:256M
题目描述
寻找因子个数为n的最小整数x.

输入描述:
输入整数n。(1<=n<=1000)

输出描述:
输出x。

示例
示例1
输入
3
输出
4

提示

猛一看,这个题目很简单啊,先不考虑复杂度问题,我们直接暴力来一次,很简单的

直接对一个较大数进行循环,判断到底有多少因子,因子数量与输入的数一致就输出这个数

于是,很简单的就得到一个暴力傻瓜的代码

class Solution:
    def __init__(self) -> None:
        pass
    
    def solution(self, n):
        result = None

        # TODO: 请在此编写代码
        if n<3:
            return n
  
        for i in range(1000):
            z = [1,i] # 把1和数本身
            for j in range(2,n):
                if i%j==0:
                    z.append(j)
            if len(z)==n:
                #z.sort()
                #print(z) # 查看因子组合都有哪些数
                return i
                
        return result
                
if __name__ == "__main__":


    n = int(input().strip())
    
    sol = Solution()
    result = sol.solution(n)

    print(result)

很轻松就得到了 70% 的通过率,很简单嘛

然后,考虑到部分数字只能是2^n,这里的n一定是素数

那么,再追加一个素数判断

        # TODO: 请在此编写代码
        if n<3:
            return n
  
        su = [2,3,5,7,11,13,17,19]
        for i in range(21,n+1,2):
            isSu = True
            for j in su:
                if i % j == 0:
                    isSu = False
                    break
            if isSu:
                su.append(i)
        if n in su:
            return 2 ** (n-1)
        
        for i in range(1000):
            z = [1,i] # 把1和数本身
            for j in range(2,n):
                if i%j==0:
                    z.append(j)
            if len(z)==n:
                #z.sort()
                #print(z) # 查看因子组合都有哪些数
                return i
                
        return result

哦吼,直接飙到 90% 的通过率了,那么问题来了,以上这些都是没有考虑到大数因子的情况,比如输入值是1000怎么搞,这个肯定算不出来的,而且,每日一练的提交用例测试里,还真有一个1000作为测试数据的。。。

为了 100% 通过率,老顾开始上头,先百度别人的解决办法,找到一个好文章

https://blog.csdn.net/weixin_73178250/article/details/126790315

。。。。。。嗯,抄这个代码,直接是 100% 通过率,问题是,你这个公式是什么鬼?你这个实现和这个公式有什么关系?老顾不造啊,老顾蒙圈啦,老顾自闭咯。。。。。。。
在这里插入图片描述
还是让老顾死一死去冷静一下。。。。。

抽完烟回来,不死心,应该不是就这么一个公式可以达到这个题的解答吧,哪怕有点其他笨办法呢?

于是,再次进行搜索,找到另一篇文章

https://blog.csdn.net/Cey_Tao/article/details/126747772

嗯,这个就舒服多了,没有那些难懂的公式,没有那些难懂的实现

在这里插入图片描述
这个描述多简单啊,直接就可以理解了,比如,我要找一个12个因子的最小数,那么,先把12分解,成为 [2 , 2 , 3],那么最小12因子的数就可以用这个组合来判断出来了,结合槐阳7的讲解,那么,我们只需要根据这个因子来判断出所有组合,然后根据各个组合计算出最终值,得到最小的就好,至于上边这两个文章里的 dfs 什么的,都见鬼去吧,老顾用个笨办法先实现出来看看


# 请关闭中文输入法,用英文的字母和标点符号。
# 如果你想运行系统测试用例,请点击【执行代码】按钮,如果你想提交作答结果,请点击【提交】按钮,
# 注意:除答案外,请不要打印其他任何多余的字符,以免影响结果验证
# 本OJ系统是基于 OxCoder 技术开发,网址:www.oxcoder.com
# 模版代码提供基本的输入输出框架,可按个人代码习惯修改


class Solution:
    def __init__(self) -> None:
        pass
    
    def solution(self, n):
        result = None

        # TODO: 请在此编写代码
        # 避免有特例1掉坑
        if n<3:
            return n # 10% 通过
        # 获取当前数字 n 之内的所有素数
        su = [2,3,5,7,11,13,17,19]
        for i in range(21,n+1,2):
            isSu = True
            for j in su:
                if i % j == 0:
                    isSu = False
                    break
            if isSu:
                su.append(i)
        # 如果是素数直接返回
        if n in su:
            result = 2 ** (n-1) # 30%,与之前的10% 组合成 40%
            
        else:
            # (1+a1)(1+a2)(1+a3)...看看公式多简单
            t = [] # 得出因子数的各个素数因子
            x = n
            while x > 1:
                for i in su:
                    if i>x:
                        break
                    if x % i ==0:
                        t.append(i)
                        x //= i

            # 根据各个素数因子的数量得出可以得到多少中组合
            # 比如 15 个因子,15 分解成 3 和 5
            # 只有两种组合,即 2**4 * 3**2 和 2 ** 14 的组合
            # 我们默认非素数时,不返回 2**(n-1),所以就当做只有一种组合

            t.sort(reverse=True)
            o = [[t.count(k),k] for k in t]
            g = 1
            for i in o:
                g *= i[0]
            
            # 如果只有一种组合,则直接输出
            if g==1:
                #print(o)
                r = 1
                for i in range(len(t)):
                    r *= su[i]**(t[i]-1) 
                return r  # 20% 与之前的 40% 组合成 60%
            else:
                # 获得所有的组合,然后根据组合分别计算取最小的值即可
                z = self.MakeGroup([t])
                final = []
                mx = 2**(n-1)
                for grp in z:
                    r = 1
                    for i in range(len(grp)):
                        r *= su[i]**(grp[i]-1)
                    if r<mx:
                        mx = r
                        final = grp
                #print(mx,grp)
                result = mx

        return result
    
    # 老顾的笨办法,将各种组合枚举出来
    # 比如 [3,3,2,2]
    # 就可以得到 [[3,3,2,2],[4,3,3],[6,3,2],[9,2,2],[9,4],[12,3],[18,2]]
    # 然后便利组合即可
    def MakeGroup(self,arr):
        l = len(arr[-1])
        if l == 2:
            arr.append([arr[-1][0]*arr[-1][1]])
        else:
            same = [i for i in arr if len(i)==l]
            for i in range(len(same)):
                f = [j for j in same[i]]
                c = same[i]
                for m in range(l-1):
                    for n in range(m+1,l):
                        nn = c[m]*c[n]
                        nt = c[:m]+c[m+1:n]+c[n+1:]+[nn]
                        nt.sort(reverse=True)
                        if nt not in arr:
                            arr.append(nt)
            arr = self.MakeGroup(arr)
                    
        return arr

if __name__ == "__main__":


    n = int(input().strip())
    
    sol = Solution()
    result = sol.solution(n)

    print(result)


很好,通过率100%了,复杂度估计除了排列组合哪里,也没什么复杂度了,哦耶,让那个 dfs 见鬼去吧

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

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

相关文章

Node学习1

Node 加载模块&#xff1a; 加载内置模块和第三方模块直接require&#xff08;名字&#xff09; 自定义模块需要加路径 require&#xff08;&#xff09;加载模块时候会自动调用被加载模块代码require永远以module.export所指向的对象为准 模块作用域&#xff1a; 和函数作用…

QT之事件系统

QT之事件系统1. 概述2. 事件的传递3. 事件类型4. 事件处理与事件过滤5. 自定义事件5.1 Demo6. 发送事件7. 参考1. 概述 在QT中&#xff0c;事件均派生自QEvent抽象类&#xff0c;事件可以由任何派生自QObject的子类实例接收和处理。它们与widget关联性极强。 2. 事件的传递 …

有了这 4 款工具,老大再也不怕我写烂SQL了

一、mysqltuner.pl 是 MySQL 一个常用的数据库性能诊断工具&#xff0c;主要检查参数设置的合理性包括日志文件、存储引擎、安全建议及性能分析。针对潜在的问题&#xff0c;给出改进的建议。是 MySQL 优化的好帮手。 在上一版本中&#xff0c;MySQLTuner支持 MySQL / MariaD…

LightningChart JS v4.0.0 and LightningChart NET

LightningChart JS v4.0.0 引入了新的 DataGrid 组件、全面的折线图类型和视觉主题。2023 年 2 月 9 日 - 16:05 新版本特征 下一代色彩主题&#xff1a; 暗金。网络空间。绿松石六角形。光。光自然。自定义 - 创建您自己的下一代颜色主题。新的 DataGrid 组件 DataGrid 组件是…

linux基本功系列之tar命令实战

文章目录前言一. tar命令介绍二. 语法格式及常用选项三. 参考案例3.1 仅打包不压缩3.2 打包后使用调用压缩命令进行压缩3.3 列出文件的内容3.4 追加文件到tar命令中3.5 释放文件到指定的目录四 . 各种压缩方式的比较总结前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓…

开学季该准备哪款电容笔?2023平替电容笔推荐

如今&#xff0c;电容笔越来越受欢迎&#xff0c;性能也越来越好。所以&#xff0c;如何选择一款具有高性价比的电容笔就成了人们的重点关注。现在&#xff0c;越来越多的人开始使用电容笔&#xff0c;所以&#xff0c;人们都在寻求更好、更经济的电容笔。所以&#xff0c;什么…

21省人均GDP超过1万美元,北京以19.01万元继续稳居榜首

在过去的2022年&#xff0c;各省都交了优秀的“成绩单”&#xff0c;各省的经济强弱即将揭晓。广东与江苏的GDP均超过12万亿元&#xff0c;是31省中超过12万亿元的两个城市&#xff0c;GDP分别为12.91万亿元与12&#xff0c;18万亿元。山东省、浙江省、河南省紧随其后&#xff…

linux yum安装卸载jdk8

1>安装1 yum -y list java* 列出jdk列表2 yum install -y java-1.8.0-openjdk-demo.x86_64&#xff08;安装这个java -version 正常显示&#xff0c;但是javac不能用&#xff0c;因为yum install java 只是安装了java的运行时环境&#xff0c;并不支持编译&#xff0c;安装成…

如何在线批量压缩PDF

PDF格式文档是我们日常比较常用的格式文档之一&#xff0c;那么有什么方法可以减小PDF大小呢&#xff1f;如果PDF比较多是否能批量处理呢&#xff1f; 首先打开浏览器搜索speedpdf就能找到这个在线压缩工具&#xff0c;点击进入后选择PDF压缩可以。如果需要手机和电脑端同步压…

react中Modal组件与openlayers地图实例化在feature要素绘制与清除等场景中存在的bug

在有地图的实际业务中会有一个经常的场景&#xff0c;那就是地图的初始化&#xff0c;一般如下&#xff1a; useEffect(() > {initMap();}, [visible]);我们经常利用Modal组件中open属性状态true与false来作为监听地图初始化的条件。 <Modaltitle{<div className"…

Python导入模块,Python import用法

使用 Python 进行编程时&#xff0c;有些功能没必须自己实现&#xff0c;可以借助 Python 现有的标准库或者其他人提供的第三方库。比如说&#xff0c;在前面章节中&#xff0c;我们使用了一些数学函数&#xff0c;例如余弦函数 cos()、绝对值函数 fabs() 等&#xff0c;它们位…

git修改历史提交(commit)信息

我们在开发中使用git经常会遇到想要修改之前commit的提交信息&#xff0c;这里记录下怎么使用git修改之前已经提交的信息。一、修改最近一次commit的信息 首先通过git log查看commit信息。 我这里一共有6次commit记录。 最新的commit信息为“Merge branch ‘master’ of https:…

在线研讨会邀请 | 赋能“大”研发,助力“快”交付

在全速前进的后疫情时代&#xff0c;公司业务飞速发展&#xff0c;您&#xff0c;准备好了吗—— 您的开发、设计、美术等团队可能分布在全球各地&#xff0c;您如何帮助他们实现跨部门、跨区域的协作——让他们便捷共享、审查各种大文件&#xff08;包括二进制文件&#xff0…

【GD32F427开发板试用】+ GDLink和USART2

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;夏漳 一 GDLink下载和调试 1.1 硬件结构和试用板组成 感谢极术社区提供的GD32开发板&#xff0c;具体的板子资源和配套软件可以在极术社区官…

09笔记 IO操作

目录 一.向一个文本文件中写入数据&#xff1a; 二.从一个文本文件中读取数据&#xff0c;并对读取的数据做简单处理。 三.二进制文件的写入操作 四.对二进制文件的读取操作 五. 举例 六.IO操作的简单应用&#xff08;代码和举例都在更新和完善中&#xff09; 一.向一个文本…

软件测试工程师成神之路2023整理版

版本 更新日期 审核 备注 V0.3 2020-06-01 三丰 增加3大自动化 V1.0 2021-10-01 Nick 添加持续集成 V2.0 2023-01-31 三丰 完整性能版本 我看到迄今为止最完整的软件测试技术路线梳理 Python 编程语言 自动化之Python 编程语言 编程语言介绍/编程概念讲解/环…

大数据技术架构(组件)29——Spark:Memory Model(2)

2.1.8.5、Memory addressing以上小节介绍了spark对堆的划分&#xff0c;根据使用目的不同&#xff0c;对堆进行了区域划分,并说明了spark1.6之前和之后使用的两种不同内存模型管理以及之间的区别&#xff0c;那么这里继续逐步分析&#xff0c;说到内存管理&#xff0c;spark是如…

CTFshow菜狗杯-misc-wp(详解 脚本 过程 全)

首先感谢ctf平台和各位出题的大佬其次感谢各位读者&#xff0c;对我的支持( •̀ ω •́ )y 有什么问题和建议可以私聊我废话不多话开启你们的旅程吧 这个也是我这几天才看 一些见解和思路分享给你们希望你们在旅途中玩的开心&#xff0c;学的开心✌( •̀ ω •́ )y杂项签到…

opencv+python物体检测【03-模仿学习】

仿照练习&#xff1a;原文链接 步骤一&#xff1a;准备图片 正样本集&#xff1a;正样本集为包含“识别物体”的灰度图&#xff0c;一般大于等于2000张&#xff0c;尺寸不能太大&#xff0c;尺寸太大会导致训练时间过长。 负样本集&#xff1a;负样本集为不含“识别物体”的…

无公网IP环境快解析实现医美ERP外网访问

现阶段&#xff0c;借助医学手段让人们变美逐渐成为时尚&#xff0c;医美走进公众生活的步伐也在不停加快&#xff0c;整个医美行业总体处于蓬勃发展之势&#xff0c;因此医美行业ERP需求量也不断增加。医美管理软件系统涵盖HIS、进销存、CRM、CallCenter、经营报表等模块&…