解题思路
反射m次,相当于形成一个n=m+1边形。对于每个n,考虑顺时针和逆时针绕圆心转了整数圈,并且每次反射角不能大于180度。假设饶了k圈,因为每个内角要小于180度,所以k肯定小于n/2,并且在发射m次之前不能回到起始点,所以k与n一定互质。那么问题就变成求小于n/2的数中有多少个数与n互质。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a%b);
}
int main () {
int cas, n;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &n);
if (n == 1) printf("1\n");
else {
n++;
int k = n / 2, c = 0;
for (int i = 1; i <= k; i++)
if (gcd(i, n) == 1) c++;
printf("%d\n", 2 * c);
}
}
return 0;
}