解题思路
基本算法思想“倍增”的模板题
思想很简单,[算法介绍点这里]
加法次数高达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)