0
点赞
收藏
分享

微信扫一扫

扔球 51Nod - 1262

​​https://www.51nod.com/Challenge/Problem.html#!#problemId=1262​​

在圆上反弹n次并回到原点 那就是用(n+1)个点将圆(n+1)等分 并且这(n+1)个点每个都要走一遍且仅一遍 那每次间隔点的数量必须和(n+1)互质 不然走不够(n+1)次 求一下欧拉函数即可 题目上说的什么反向走一次完全是干扰信息

 

#include  <bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;

int val[maxn];
int tot;

void solve(int n)
{
int i;
for(i=2;i*i<=n;i++){
if(n%i==0){
val[++tot]=i;
while(n%i==0) n/=i;
}
}
if(n!=1) val[++tot]=n;
}

int main()
{
int n,i,ans;
scanf("%d",&n);
solve(n+1);
ans=n+1;
for(i=1;i<=tot;i++){
ans/=val[i];
ans*=(val[i]-1);
}
printf("%d\n",ans);
return 0;
}

 


举报

相关推荐

0 条评论