# 858. Mirror Reflection

• 光线先处于起始点(0,0), 然后假设以dx=p, dy=q的速度前进
• 肯定是x或者是y先到达边缘，x的边缘是[0, p], y的边缘是[0, p]
• 如果是x到达边缘的话，那么dx就会变换方向
• 如果是y到达边缘的话，那么dy就会变换方向
```class Solution:
def mirrorReflection(self, p: int, q: int) -> int:
x, y = 0, 0
dx, dy = p, q
eps = 1e-6

def near(x, y, a, b):
return abs(a - x) < eps and abs(b - y) < eps

def eq(x, y):
return abs(x - y) < eps

ans = -1
while True:
if near(x, y, p, 0):
ans = 0
break
if near(x, y, p, p):
ans = 1
break
if near(x, y, 0, p):
ans = 2
break

if dx > 0:
tx = (p - x) / dx
else:
tx = -x / dx
if dy > 0:
ty = (p - y) / dy
else:
ty = -y / dy
t = min(tx, ty) # x,y某一个先到达边缘
x += dx * t
y += dy * t

# print('>>>', x, y, dx, dy)
# 如果到达边缘，调整行进方向，但是其实速度是不变的
if eq(x, 0) or eq(x, p):
dx = -dx
if eq(y, 0) or eq(y, p):
dy = -dy

return ans

``` ```First, think about the case p = 3 & q = 2.

So, this problem can be transformed into finding m * p = n * q, where
m = the number of room extension + 1.
n = the number of light reflection + 1.

If the number of light reflection is odd (which means n is even), it means the corner is on the left-hand side. The possible corner is 2.
Otherwise, the corner is on the right-hand side. The possible corners are 0 and 1.
Given the corner is on the right-hand side.
If the number of room extension is even (which means m is odd), it means the corner is 1. Otherwise, the corner is 0.
So, we can conclude:

m is even & n is odd => return 0.
m is odd & n is odd => return 1.
m is odd & n is even => return 2.
Note: The case m is even & n is even is impossible. Because in the equation m * q = n * p, if m and n are even, we can divide both m and n by 2. Then, m or n must be odd.

--
```