81 lines
2.3 KiB
C++
81 lines
2.3 KiB
C++
![]() |
// Source : https://leetcode.com/problems/mirror-reflection/description/
|
|||
|
// Author : Hao Chen
|
|||
|
// Date : 2018-06-27
|
|||
|
|
|||
|
/***************************************************************************************
|
|||
|
*
|
|||
|
* There is a special square room with mirrors on each of the four walls. Except for
|
|||
|
* the southwest corner, there are receptors on each of the remaining corners, numbered
|
|||
|
* 0, 1, and 2.
|
|||
|
*
|
|||
|
* The square room has walls of length p, and a laser ray from the southwest corner
|
|||
|
* first meets the east wall at a distance q from the 0th receptor.
|
|||
|
*
|
|||
|
* Return the number of the receptor that the ray meets first. (It is guaranteed that
|
|||
|
* the ray will meet a receptor eventually.)
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
* Example 1:
|
|||
|
*
|
|||
|
*
|
|||
|
* Input: p = 2, q = 1
|
|||
|
* Output: 2
|
|||
|
* Explanation: The ray meets receptor 2 the first time it gets reflected back to the
|
|||
|
* left wall.
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
* Note:
|
|||
|
*
|
|||
|
*
|
|||
|
* 1 <= p <= 1000
|
|||
|
* 0 <= q <= p
|
|||
|
*
|
|||
|
***************************************************************************************/
|
|||
|
|
|||
|
/*
|
|||
|
* Solution
|
|||
|
* --------
|
|||
|
*
|
|||
|
* We know the following things:
|
|||
|
* 1)every reflection will increase the step of `q`.
|
|||
|
* 2) when reach the top, the reflection would go down, when reach the bottom the reflection would go up.
|
|||
|
*
|
|||
|
* So, we can image if there have two walls, left one and right one, then the reflection can go up instanstly,
|
|||
|
*
|
|||
|
* - the reflection points on left wall would be even times of `q`.
|
|||
|
* - the reflection points on right wall would be odd times of `q`.
|
|||
|
*
|
|||
|
* And in the right wall, the receptors `#0` would be the times of `2p`.
|
|||
|
*
|
|||
|
* So, we need find the least common multiple of `p` and `q`, then we can have the answer.
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
class Solution {
|
|||
|
private:
|
|||
|
//GCD - greatest common divisor 最大公因数
|
|||
|
int greatestCommonDivisor (int a, int b) {
|
|||
|
if(b) while((a %= b) && (b %= a));
|
|||
|
return a + b;
|
|||
|
}
|
|||
|
//LCM - least common multiple 最小公倍数
|
|||
|
int leastCommonMultiple(int a, int b) {
|
|||
|
return a * b / greatestCommonDivisor(a, b);
|
|||
|
}
|
|||
|
public:
|
|||
|
int mirrorReflection(int p, int q) {
|
|||
|
int lcm = leastCommonMultiple(p, q);
|
|||
|
if (lcm % (2*p) == 0 ) return 0;
|
|||
|
|
|||
|
int nq = lcm / q;
|
|||
|
|
|||
|
if (nq % 2 == 0 ) return 2;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
};
|
|||
|
|