AtCoder Beginner Contest 129 题解
AC Codes
A – Airplane
B – Balance
C – Typical Stairs
D – Lamp
给定一个 H×W 的带障碍物的网格图,询问在某个点放一盏灯最多能够照亮几个单元格。灯只能照亮上下左右四个方向,并且光线遇到障碍物后就会停止。
H,W≤2000 。
直接开四个矩阵分别存储 (i,j) 这个点向上下左右四个方向最远能走几步。
E – Sum Equals Xor
给定 L 求满足 a+b≤L 并且 a⊕b=a+b 的自然数 (A,B) 对数。
L≤2100001 。
不懂数位 dp,因此直接找规律,不难发现规律是 a[n]=3×a[⌊n2⌋]+(nmod2)×2popcount(n−1) ,用记忆化搜索即可解决本题。
F – Takahashi’s Basics in Education and Learning
等差数列 s 满足 si=A+Bi ,将前 L 项 si 首尾相连构成大数模 M 的值。比如样例 3,7,11,15,19 就会拼接成 37111519 。
1≤A,B,L≤1018,M≤109 并且保证 si≤1018 。
做法不是很难,但是边界处理很繁琐,代码打了一整天。
先观察样例 A=3,B=4,L=5:
稍微变形一下:
再来个更明显的样例 A=1,B=25,L=6(1,26,51,76,101,126):
稍微变形一下:
可以注意到一个重要事实:10d 可以看作一个分段的等差数列,而且根据数据范围公差最大不超过 18 。然后,以上方的样例 A=1,B=25,L=6 为例,首先出现了一个等差三角形:
公差发生变化后,又出现了一个新的等差三角形:
对于某个等差三角形(假设有 k 层)
我们需要求解的是这个三角形最后一行的和,以及这个三角形整体的和。最后一行的求和显然就是等差数列求和,而整个三角形的求和则可以写成:
这种等差 x 等比的合成数列求和有一个经典方法:错位相减(相信高中数学里一定学过)。
上下相减后得到:
但是!本题中的模数可能为合数,因此直接这么做是不行的(逆元不存在)。观察到这个三角形的递推性质,不妨令数列 ai=100+10q+⋯+10(i−1)q ,于是有以下递推关系 ai+1=10qai+1 , 差分一下得到:
注意到这是一个常系数齐次线性递推数列,因此可以求出该数列的生成函数 f ,答案就是 [xk−1]f1−x 。