有一個特殊的正方形房間,每面牆上都有一面鏡子。除西南角以外,每個角落都放有一個接受器,編號爲 0
, 1
,以及 2
。
正方形房間的牆壁長度爲 p
,一束激光從西南角射出,首先會與東牆相遇,入射點到接收器 0
的距離爲 q
。
返回光線最先遇到的接收器的編號(保證光線最終會遇到一個接收器)。
示例:
輸入: p = 2, q = 1
輸出: 2
解釋: 這條光線在第一次被反射回左邊的牆時就遇到了接收器 2 。
提示:
1 <= p <= 1000
0 <= q <= p
思路:既然保證可以回到某個點(其實只要是int值的pq,都一定會回到0 1 2某個點,可證明),找回到0/1/2的分佈滿足什麼規律。0就是碰牆第奇數次,水平行走距離爲q的奇數唄且是p的偶數倍,1是碰牆第奇數次,q的奇數倍,p的奇數倍,2是碰牆第偶數次且是p的奇數倍。水平行走距離是反彈第i次的q倍,用i模2且iq模p/2p得解。
class Solution {
public:
int mirrorReflection(int p, int q) {
int i;//反彈次數
for(i=1;;i++)
{
if(i%2==0)
{
if((i*q)%(2*p)==p) {return 2;}
}
else
{
if((i*q)%(2*p)==p) {return 1;}
else if((i*q)%(2*p)==0) {return 0;}
}
}
}
};