蓝桥杯: log2与加法

解题思路

基本算法思想“倍增”的模板题

思想很简单,[算法介绍点这里]

加法次数高达10^9,不能硬算
 

设log(2,a)表示以2为底a的对数,假设Q=7,加法过程可以表示为:先运算一次得到A1,再在A1的基础上运算2次得到A2,再在A2基础上运算4次得到最终结果。以上运算对应了7的二进制表示(111)。Q都能表示成二进制形式然后按照上面的方法计算,运算次数将降低为O(log(2,Q))。
 

设数组s[i][j]表示“以A=j为起点,运算2^(i-1)后A的值”。以上面Q=7为例,A=s[0][A],A1=s[1][A],A2=s[2][A1],A3=s[3][A2]为答案
 

预处理s[i][j]数组:s[i][j]=log(2, s[ i-1 ][ s[i-1][j] ] )+B
 

Q不过log(2,10^9)约等于30;尽管每次加B可能高达10^5,但是log(2,10^5)只有17,也就是说这次B的影响,到下次算log时只有log(2,17)大约4的影响,越来越小,所有A不会超过题目上限很多。综上,时间复杂度O(30*10^5)

python代码

import os
import sys
import math

MAXA=10**5+20
MAXQ=30+1
s=[[] for _ in range(MAXQ)]

A,B,Q=list(map(int,input().split()))

for i in range(MAXQ):
  s[i]=[0 for _ in range(MAXA)]

for i in range(1,MAXA):
  s[0][i]=i

for i in range(1,MAXQ):
  for j in range(1,MAXA):
    s[i][j]=int(math.log(s[i-1][s[i-1][j]],2))+B


logq=math.ceil(math.log(Q,2))
curA=A
for i in range(logq+1):
  if Q&(1<<i):
    curA=s[i][curA]

print(curA)
  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值