题目链接:Circular Billiard Table
题目大意:
从圆盘的边缘以某个角度发射一颗小球,小球在圆盘内部沿反射定律运动,问第一次回到原点之前一共碰撞了多少次。
解题思路:
由反射定律可知小球每两次反射之间的圆心角是相同的,不妨设为 α。
若小球反射 n 次后回到原点,则 nα = k · 360°(k 为某个自然数)。
换言之,最小的 n 即为最小的 n 使得 360|nα,利用 gcd 算一下即可。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int T; scanf("%d", &T);
while (T--)
{
ll a, b; cin >> a >> b;
b = b * 180;
printf("%lld\n", (b / gcd(a, b)) - 1);
}
return 0;
}