题目传送门
看到几个大佬的题解,深感数学不行。本蒟蒻就来发一个小学生都能看懂的找规律题解。
思路
我们假设开始时有 t 个机器人。我们记 f(x) 为 x 年后的机器人个数,然后我们开始尝试前几项:
f(1)f(2)f(3)f(4)f(5)⋯=t+(2t−1)=3t−1+(2(2t−1)−1)=7t−4+(2(4t−3)−1)=15t−11+(2(8t−7)−1)=31t−26+(2(16t−15)−1)=3t−1=7t−4=15t−11=31t−26=63t−57
我们先看结果含 t 的一次项:
3t7t15t31t63t⋯
取他们系数的差可以发现,差的数列为:
481632⋯
又因为 3=1+2,我们记 A(x) 为一次项系数,x 为过去的时间,可以得到以下关系:
A(x)=1+2+4+⋯+2x=2x+1−1
接下来看常数项:
14112657⋯
取差:
371531⋯
有没有觉得很眼熟,这就是一次项系数的规律。
所以我们记 B(x) 为常数项,x 为所过的时间,可以得到以下关系:
B(x)=i=1∑xA(i−1)
当然 B(0) 是特例, B(0)=0
现在我们来计算一下 B(x) 的通项公式:
B(x)=i=1∑xA(i−1)=A(0)+A(1)+⋯+A(x−1)=(21−1)+(22−1)+⋯+(2x−1)=(2x+1−2)−x
所以基本上就大功告成了!
所以 n 年后的机器总数为:
s=A(n)t+B(n)=(2n+1−1)t−[(2n−2)−n]=2n+1t−t+n−2n+1+2=(2n+1−1)(t−1)+t+1
把它化简表示为 t 的函数形式,易得
t=2n+1−1s−n−1+1
最后看到样例二的那一大串数字 2218388550399401452619230609499,我们肯定要用高精度。作为一个蒟蒻,高精度肯定用 Python 啦!
AC 代码
1 2 3 4 5
| from math import pow n,s = input().split(" ") n,s = int(n),int(s) print(str(int((s-n-1)/(int(pow(2,n+1))-1)+1)))
|
AC 记录
看在作者写这么多的份上,点个赞再走呗 qwq。