hdu 5430 Reflect(数论)

来源:互联网 发布:网络彩票赌博的危害 编辑:程序博客网 时间:2024/06/05 09:43

题目链接:hdu 5430 Reflect

解题思路

反射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;}
0 0