第十一届蓝桥杯——整数拼接

博客详细解析了第十一届蓝桥杯中关于整数拼接的问题,指出暴力解法会超时,并提出优化策略。通过建立表存储乘10的幂次对k取余的结果,减少内层循环的时间复杂度。最后强调了计算中长整型转换和取模防止溢出的重要性,并提示需考虑拼接顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

 

题解:

如果是暴力做法的话,肯定是两个循环遍历一下就行,时间复杂度是O(n^2),但是就这道题而言肯定会超时。

要想计算出有多少种拼法满足两个整数拼出的整数是k的倍数,必须遍历到每一个数,即外层循环必不可少,那如何将内层循环O(n)降下来呢。先将表达式写出来,假如找到两个数Ai和Aj,那么拼出来的数就是Ai*(10^(len(Aj))+Aj,例如12和345拼起来就是12*(10^3)+345,它的余数(Ai*(10^(len(Aj))+Aj)%k就等于((Ai%k*(10^len(Aj)%k))%k + Aj%k)%k.    (len(Aj)表示Aj这个数的长度)

先看前面一项,(Ai%k*(10^len(Aj)%k))%k,由数据范围可知,len(Aj)的长度必然是大于等于1,小于等于10的,而对k取余后,余数肯定小于k的范围,因此数据允许,我们可以建立一张表,用来存放Ai乘10的不同次方(从1到10即可)对k取余的结果的个数,即b[r][(Ai%k*(10^r%k))%k],可知,第一个中括号的r范围是1-10,第二个中括号的范围是小于0-k。

再看第二项Aj%k,如果满足题目条件,那么((Ai%k*(10^len(Aj)%k))%k + Aj%k)%k=0,第一项和第二项的和一定是k(因为两者都小于k),k-Aj%k=(Ai%k*(10^len(Aj)%k))%k,我们如果在上面的表中找到b[len(Aj)][k-Aj%k],证明满足了题目条件,ans++就行。

时间复杂度分析:solve函数外层循环n,内层循环10,log10函数的复杂度为log10(Ai)=9.所以个人

题目描述 给定两个整数 a 和 b,将它们拼接起来得到一个新的整数。 例如,a=12,b=34,则拼接后得到的新整数为 1234。 输入格式 输入共两行,第一行为正整数 a,第二行为正整数 b。两个数字都不超过 10000 位。 输格式 输一个整数,表示拼接后的新整数。 样例输入 12 34 样例输 1234 算法1 (字符串拼接) $O(n)$ 将两个整数转化为字符串,然后将它们拼接起来,最后将拼接后的字符串转化为整数即可。 时间复杂度 字符串拼接的时间复杂度为 O(n),其中 n 表示两个整数的位数。 空间复杂度 需要额外 O(n) 的空间存储字符串。 Python 代码 a = input().strip() b = input().strip() c = int(a + b) print(c) 算法2 (字符串迭代) $O(n)$ 根据题目要求,需要将两个整数拼接起来,可以将两个整数转化为字符串后,通过迭代的方式将两个字符串拼接起来,最后将拼接后的字符串转化为整数即可。 时间复杂度 字符串迭代的时间复杂度为 O(n),其中 n 表示两个整数的位数。 空间复杂度 需要额外 O(n) 的空间存储字符串。 Python 代码 a = input().strip() b = input().strip() c = '' for i in a: c += i for j in b: c += j c = int(c) print(c) 算法3 (数学运算) $O(logn)$ 根据题目要求,需要将两个整数拼接起来,可以通过数学运算实现。 设第一个整数为 a,第二个整数为 b,其位数分别为 len1 和 len2。 将第二个整数 b 乘以 10 ^ len1,然后加上第一个整数 a 即可得到拼接后的结果。 时间复杂度 时间复杂度为 O(logn),其中 n 表示两个整数的位数。 空间复杂度 只需要额外 O(1) 的空间存储变量。 Python 代码 a = input().strip() b = input().strip() c = int(b) + int(a) * (10 ** len(b)) print(c)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值