镜子反射

int mirrorReflection(int p, int q) {
    // 反射相当于方形折叠展开、光线穿透直射
    // 当 (k*q)%p == 0 时到达接收器,k最小时 k*q == lcm(p,q) == p*q/gcd(p,q)
    // 所以,横向方形数k = p/gcd(p,q),纵向方形数k*q/p = q/gcd(p,q)
    // 只需考查横向、纵向方形数的奇偶性
    int g = gcd(p, q);
    p /= g, p %= 2; // 横向
    q /= g, q %= 2; // 纵向

    if (p == 0) return 2;
    if (q == 0) return 0;
    return 1;
}

int gcd(int p, int q) {
    if (q == 0) return p;
    return gcd(q, p % q);
}