题解 P8629 [蓝桥杯 2015 国 C] 机器人繁殖

题目传送门

看到几个大佬的题解,深感数学不行。本蒟蒻就来发一个小学生都能看懂的找规律题解。

思路

我们假设开始时有 tt 个机器人。我们记 f(x)f(x)xx 年后的机器人个数,然后我们开始尝试前几项:

f(1)=t+(2t1)=3t1f(2)=3t1+(2(2t1)1)=7t4f(3)=7t4+(2(4t3)1)=15t11f(4)=15t11+(2(8t7)1)=31t26f(5)=31t26+(2(16t15)1)=63t57\begin{aligned} f(1) &= t+(2t-1) &= 3t-1 \\ f(2) &= 3t-1+(2(2t-1)-1) &= 7t-4 \\ f(3) &= 7t-4+(2(4t-3)-1) &= 15t-11 \\ f(4) &= 15t-11+(2(8t-7)-1) &= 31t-26 \\ f(5) &= 31t-26+(2(16t-15)-1) &= 63t-57 \\ \cdots \end{aligned}

我们先看结果含 tt 的一次项:

3t7t15t31t63t3t\quad7t\quad15t\quad31t\quad63t\cdots

取他们系数的差可以发现,差的数列为:

4816324\quad8\quad16\quad32\cdots

又因为 3=1+23=1+2,我们记 A(x)A(x) 为一次项系数,xx 为过去的时间,可以得到以下关系:

A(x)=1+2+4++2x=2x+11A(x)=1+2+4+\cdots+2^x=2^{x+1}-1

接下来看常数项:

141126571\quad4\quad11\quad26\quad57\cdots

取差:

3715313\quad7\quad15\quad31\cdots

有没有觉得很眼熟,这就是一次项系数的规律。

所以我们记 B(x)B(x) 为常数项,xx 为所过的时间,可以得到以下关系:

B(x)=i=1xA(i1)B(x)=\sum^{x}_{i=1}A(i-1)

当然 B(0)B(0) 是特例, B(0)=0B(0)=0

现在我们来计算一下 B(x)B(x) 的通项公式:

B(x)=i=1xA(i1)=A(0)+A(1)++A(x1)=(211)+(221)++(2x1)=(2x+12)x\begin{aligned} B(x) &= \sum^{x}_{i=1}A(i-1)\\ &= A(0)+A(1)+\cdots+A(x-1)\\ &= (2^1-1)+(2^2-1)+\cdots+(2^{x}-1)\\ &= (2^{x+1}-2)-x\\ \end{aligned}

所以基本上就大功告成了!

所以 nn 年后的机器总数为:

s=A(n)t+B(n)=(2n+11)t[(2n2)n]=2n+1tt+n2n+1+2=(2n+11)(t1)+t+1\begin{aligned} s &= A(n)t+B(n)\\ &= (2^{n+1}-1)t-[(2^n-2)-n]\\ &= 2^{n+1}t-t+n-2^{n+1}+2\\ &= (2^{n+1}-1)(t-1)+t+1\\ \end{aligned}

把它化简表示为 tt 的函数形式,易得

t=sn12n+11+1t=\frac{s-n-1}{2^{n+1}-1}+1

最后看到样例二的那一大串数字 22183885503994014526192306094992218388550399401452619230609499,我们肯定要用高精度。作为一个蒟蒻,高精度肯定用 Python 啦!

AC 代码

1
2
3
4
5
#Python代码
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。


题解 P8629 [蓝桥杯 2015 国 C] 机器人繁殖
https://sunnyli.咕咕咕.eu.org/solution-P8629/
作者
SunnyLi
发布于
2023年4月22日
许可协议