题意:从圆上一点发出射线经过n次反射回到起点,求方案数;
思路:发射射线与其在该点相切的线的夹角记作sita,则每条边所对应的圆心角为2*sita,反射n次有n+1条边,则2*sita*(n+1)=2*k*pi,k为整数;
sita=pi*k/(n+1);sita的种类数与k与(n+1)互质的情况数相同,所以转化为求k与n+1互质的情况数;
可以用欧拉函数或rho算法求解;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int t,n,m; int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b); } int main(){ int i,j,k,ans; scanf("%d",&t); while(t--){ scanf("%d",&n); ans=0; for(i=1;i<=n+1;i++){ if(gcd(i,n+1)==1){ ans++; } } printf("%d\n",ans); } return 0; }
时间: 2024-12-17 05:14:18