HDU_5430 Reflect

来源:互联网 发布:apache 改变服务器地址 编辑:程序博客网 时间:2024/06/10 19:12

http://acm.hdu.edu.cn/showproblem.php?pid=5430


思路:

反射m次,相当于形成一个n=m+1边形。对于每个n,考虑顺时针和逆时针绕圆心转了整数圈,并且每次反射角不能大于180度。假设饶了k圈,因为每个内角要小于180度,所以k肯定小于n/2,并且在发射m次之前不能回到起始点,所以k与n一定互质。那么问题就变成求小于n/2的数中有多少个数与n互质。


代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define Pi acos(-1.0)
double Deg2Rad(double deg){return (deg*Pi/180.0);}
double Rad2Deg(double rad){return (rad*180.0/Pi);}
double ArcSin(double val){return Rad2Deg(asin(val));}
double ArcCos(double val){return Rad2Deg(acos(val));}
double Sin(double deg){return sin(Deg2Rad(deg));}
double Cos(double deg){return cos(Deg2Rad(deg));}
int gcd(int a,int b)
{
return b==0 ? a : gcd(b,a%b);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
if(n==1)
{
puts("1");
continue;
}
n++;
int k=n/2,ans=0;
for(int i=1;i<=k;i++)
{
if(gcd(i,n)==1)
{
ans++;
}
}
printf("%d\n",ans*2);
}
return 0;
}





0 0
原创粉丝点击