C.Ray Tracing
题意:在n*m的空间内,一个小球从(0,0)以固定的速度 2√ ,并且以斜45°的角度出发.若碰到空间边界则反弹.若碰到空间四个角落的点则停止.给你k个点,问到达该点所需时间,若到达不了,则输出-1.
思路:
1. 按照给出的样例模拟走几遍,可以发现结束的时间为
lcm(n,m)
.
2. 希望将这些折线放在
y=x
这条直线上,就可以方便计算某点时间.那么就可以考虑怎么样找出该点在
y=x
上的点.
- 任意点 (x,y) ,设在直线 y=x 上的点为 (x′,y′) .
- x≡x′mod(2⋅n) , y≡y′mod(2⋅m)
- 即转化成线性方程组 2⋅n⋅X+2⋅m⋅Y=y−x
- 用扩展gcd求解
- 假设点 (x,y) 是第一次反弹后那条折线上的点,那么它在 y=x 上的点为 (2⋅n−x,y) 或 (x,2⋅m−y) .
- 若是两次反弹后那条折线上的点,那么它在 y=x 上的点为 (2⋅n−x,2⋅m−y) .
- 若点 (x,y) 中x=y,那么它就在直线 y=x 上.
- 不确定该点是几次弹射后,就对这四个点都进行一次方程求解,取最小值.