Star
题目链接:Star
题意:给你一个圆,从圆上任意一个点开始,可以对第k个点进行连线,接着以这个点为起点,再对第k个点进行连线。问有多少种方法能够使得所有的点都能够被连起来
思路:要把所有的点都连起来的话,那么GCD(k,n)=1。
因为我们要使k*x%n=(1~n-1),也就是遍历完所有的点
但是可能会有重复的情况,因为GCD(k,n)=1的话,那么GCD(n-k,n)也=1;
通过画一下图我们也能够看出来,所以最后的答案就是phi(n)/2
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
LL Euler(LL n)
{
LL res=n;
for(LL i=2; i*i<=n; ++i)
{
if(n%i==0)
{
res=res/i*(i-1);
while(n%i==0)
n/=i;
}
}
if(n>1)
res=res/n*(n-1);
return res;
}
int main()
{
LL n;
while(~scanf("%lld",&n))
printf("%lld\n",Euler(n)/2);
return 0;
}