Python|蓝桥杯进阶第五卷——数论

news/2024/11/27 8:44:04/

在这里插入图片描述

欢迎交流学习~~


专栏: 蓝桥杯Python组刷题日寄


蓝桥杯进阶系列:

🏆 Python | 蓝桥杯进阶第一卷——字符串
🔎 Python | 蓝桥杯进阶第二卷——贪心
💝 Python | 蓝桥杯进阶第三卷——动态规划
✈️ Python | 蓝桥杯进阶第四卷——图论
🌞 Python | 蓝桥杯进阶第五卷——数论
💎 Python | 蓝桥杯进阶第六卷——搜索

Python|蓝桥杯进阶第五卷——数论

  • 🎁 买不到的数目
  • 🌲 幂方分解
  • 💡 麦森数
  • 🍞 欧拉函数


🎁 买不到的数目

题目:
时间限制:
1s

内存限制:
128MB

题目描述:
小明开了一家糖果店。他别出心裁:把水果糖包成 4 颗一包和 7 颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用 47 组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入描述:
两个正整数,表示每种包装中糖的颗数(都不多于1000)

输出描述:
一个正整数,表示最大不能买到的糖数

样例输入:
4 7

样例输出:
17


解题思路

这里需要先确定上边界,然后针对小于其的数逐个判断即可。(代码1)

借助数论中的结论:自然数 a,ba,ba,b 互质,则不能表示成 ax+byax+byax+byx,yx,yx,y 为非负整数)的最大整数是 ab−a−bab-a-babab,本题中所给出的数据全部为质数,因此可以使用。(代码2)


参考代码

# 代码1
from math import gcd
def check(a, b, n):if n%a == 0 or n%b == 0:return Truex = n//amod = n%afor i in range(x+1):if (i*a+mod)%b == 0:return Truereturn Falsedef func(a, b):# 计算上边界,这里取最小公倍数max_num = (a*b)//gcd(a, b)for i in range(max_num-1, 0, -1):if not check(a, b, i):print(i)breaka, b = map(int, input().split())
func(a, b)
# 代码2
n,m = map(int, input().strip().split()) 
print(n*m-m-n)

🌲 幂方分解

题目:
时间限制:
1s

内存限制:
128MB

题目描述:
任何一个正整数都可以用 2 的幂次方表示。例如:
137=2^7+2^3+2^0
同时约定方次用括号来表示,即 ab 可表示为 a(b)

由此可知,137 可表示为:
2(7)+2(3)+2(0)
进一步:7= 2^2+2+2^02^12 表示)
3=2+2^0
所以最后 137 可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如:
1315=2^10+2^8+2^5+2+2^0
所以 1315 最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入描述:
输入包含一个正整数 N(N<=20000),为要求分解的整数。

输出描述:
程序输出包含一行字符串,为符合约定的 n02 表示(在表示中不能有空格)

样例输入:
1315

样例输出:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)


解题思路

可以通过每个数的二进制来得到其二次幂分解:
比如样例中的 1315,其对应的二进制数为:0b10100100011
其中 1 对应的位置由高到低为:11 9 6 2 1
因此其对应二次幂分解为:1315 = 2^10 + 2^8 + 2^5 +2 ^1 + 2^0

对于 0 次幂和 1 次幂特别处理,而对于高次幂,通过递归调用。
注意:要从高次幂开始处理。

具体见参考代码及其注释。

参考代码

def trans(n):# 转为 2 进制后再处理tmp = list(bin(n))# 去除 2 进制前面的 0bn = tmp[2:]# 转换为整数n = [int(i) for i in n]res = ''for i in range(1, len(n) + 1):if n[len(n) - i]:if len(n) - i == 0:# 处理 0 次幂res += '2(0)+'elif len(n) - i == 1:# 处理 1 次幂res += '2+'else:# 其余情况,递归调用res += '2(' + trans(len(n) - i) + ')+'# 最后res会有一个 '+' 需要去除return res[:-1]if __name__ == '__main__':n = int(input())print(trans(n))

💡 麦森数

题目:
时间限制:
3s

内存限制:
192MB

题目描述:
形如 2^p-1 的素数称为麦森数,这时 p 一定也是个素数。但反过来不一定,即如果 p 是个素数,2^p-1不一定也是素数。到1998年底,人们已找到了 37 个麦森数。最大的一个是p=3021377,它有 909526 位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入 p(1000 < p < 3100000),计算 2^p-1 的位数和最后 500 位数字(用十进制高精度数表示)

输入描述:
文件中只包含一个整数 p(1000 < p < 3100000)

输出描述:
第一行:十进制高精度数 2^p-1的位数。
第2-11行:十进制高精度数 2^p-1 的最后 500 位数字。(每行输出 50 位,共输出 10 行,不足 500 位时高位补 0
不必验证 2^p-1p 是否为素数。

样例输入:
1279

样例输出:

386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087

解题思路

对于一个十进制数 k,其位数 A 为:A = int(log10(k) + 1)

因为当 p 取较大值时,整个数过大,考虑到最后只需要输出 500 位,我们将其对 10**500 取幂,之后再按照要求格式输出。

具体见参考代码和注释。


参考代码

from math import log10 as lg
p = int(input())
print(int(p * lg(2)) + 1)num = 2**p - 1
# 预处理,因为最后只需要500位,对 10**500 取幂
num = num % (10**500)
res = []
# 计算结果
for i in range(500):res.append(num % 10)num //= 10# 按照要求打印
for i in range(499, -1, -1):print(res[i], end='')if i % 50 == 0:print('')

🍞 欧拉函数

题目:
时间限制:
1s

内存限制:
128MB

题目描述:

给定一个大于 1,不超过 2000000 的正整数 n,输出欧拉函数,phi(n) 的值。
如果你并不了解欧拉函数,那么请参阅提示。

提示:
欧拉函数 phi(n) 是数论中非常重要的一个函数,其表示 1n-1 之间,与 n 互质的数的个数。显然的,我们可以通过定义直接计算 phi(n)
当然,phi(n) 还有这么一种计算方法。
首先我们对 n 进行质因数分解,不妨设 n=p1^a1 * p2^a2 * ... * pk^ak (这里 a^b 表示 ab次幂,p1pkk 个互不相同的质数,a1ak 均为正整数),那么
phi(n)=n(1-(1/p1))(1-(1/p2))....(1-(1/pk))
稍稍化简一下就是
phi(n)=n(p1-1)(p2-1)...(pk-1)/(p1*p2*...*pk)

计算的时候小心中间计算结果超过 int 类型上界,可通过调整公式各项的计算顺序避免(比如先做除法)!

输入描述:
在给定的输入文件中进行读入:
一行一个正整数 n。 不超过 2000000 的正整数 n.

输出描述:
将输出信息输出到指定的文件中:
一行一个整数表示 phi(n)

样例输入:
17

样例输出:
16


解题思路

直接按照定义来写即可


参考代码

from math import gcd
n = int(input())
count = 0
for i in range(1,n):if gcd(i,n)==1:count += 1
print(count)


http://www.ppmy.cn/news/35019.html

相关文章

LeetCode:242. 有效的字母异位词

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 文章目录一、&#x1f331;[242. 有效的字母异位词](https://leetcode.cn/problems/valid-…

【数据结构】树和二叉树的介绍

文章目录前言一、树1.1 树的概念1.2 树的相关概念1.3 树的表示1.4 树的用途二、二叉树2.1 二叉树的概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储方式总结前言 树是一种让程序员们既爱又恨的数据结构。它就像是一棵大树&#xff0c;让你可以轻松地摘取其中的果实…

【10】核心易中期刊推荐——模式识别与机器学习

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

【数据结构】二叉树的遍历以及基本操作

目录 1.树形结构 1.概念 2.二叉树 2.1概念 2.2 两种特殊的二叉树 2.3二叉树的存储 2.4二叉树的基本操作 1.手动快速创建一棵简单的二叉树 2.二叉树的遍历 (递归) 3.二叉树的层序遍历 4.获取树中节点的个数 5.获取叶子节点的个数 6.获取第K层节点的个数 7.获取二叉…

【算法】一文详解贪心法

一、概述 贪心法将一个复杂问题分解为一系列较为简单的局部最优解&#xff0c;每一步都是对当前解的一个扩展&#xff0c;直到获得问题的完全解。贪心法的典型应用时求解最优化问题&#xff0c;而且即使是非最优解&#xff0c;最终得出的解也和最优解比较近似 1.1 贪心法设计…

集合之HashMap 1.7总结

文章目录底层数据结构&#xff1a;HashMap有什么特点&#xff1f;HashMap 1.7 是如何解决Hash冲突的&#xff1f;HashMap 1.7 是如何降低Hash冲突概率的&#xff1f;HashMap 的长度为什么是2的幂次方&#xff1f;HashMap 容量应该如何设置&#xff1f;高并发下如何使用HashMap?…

DNS主从复制

#前提准备&#xff1a;关闭SElinux 关闭防火墙 时间同步 #环境说明&#xff1a;Centos7 #ip地址&#xff1a;dns-master&#xff1a;10.0.0.100 dns-slave&#xff1a;10.0.0.103 web&#xff1a;10.0.0.101 主DNS服务配置 1.安装软件包&#xff1a; yum install bind -…

学习 Python 之 Pygame 开发魂斗罗(十三)

学习 Python 之 Pygame 开发魂斗罗&#xff08;十三&#xff09;继续编写魂斗罗1. 创建敌人2类2. 编写敌人2类的draw()函数3. 编写敌人越界消失函数4. 编写敌人开火函数5. 把敌人2加入地图进行测试继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗&#xff08;十…