P3403跳楼机

传送门:https://www.luogu.com.cn/problem/P3403

题目大意:一个线段为[0,h - 1].你从0开始,每次可以朝任意方向走 x , y , z步。(前提是在线段内)。 问你有多少个整数点是可以到达的。(x , y , z <= 1e5 , h <= 1e15).

题目思路:

首先,由于h过大,不能直接dp递推。所以自然考虑 在 mod x 剩余系下 求解问题。 那么不管 y , z 走多少次。最终都会落在 mod x 的剩余系中。那问题规模就变小了。 

显然,可能 mod x 的剩余系中 有些值永远取不到。但值一旦第一次被取到,那么所有在本剩余系中的所有值都能被取到(通过 + x 转移)。

那么问题转化为: 对于剩余系中的i,求解能够达到位置i的最小值,记作f(i)

有了本转移方程,我们可以直接在剩余系中跑最短路。 然后推推公式计算即可。

拓展:P2662 牛场围栏

传送门:https://www.luogu.com.cn/problem/P2662

题目大意:给你若干个数。问你这些数中最大的不能被凑出来的数.

题目思路:

当 时,有无限个数组合不出来.

还是一样的状态,找最小值M作为剩余系:对于剩余系中的i,求解能够达到位置i的最小值,记作f(i)

考虑最后如何求答案?

假设答案存在于剩余系i中。 由于已知  .

所以最大的不能被凑出来的数为: f(i) - M.

最终答案为: