Problem I : Frog's Jumping
From: DHUOJ, 2017060309
(Out of Contest)
题目意思:有0,1,2,3,,,,n-1个荷叶,然后青蛙从0开始每次走(k+x)%n步数,x为当前荷叶的下标,然后走n次,并且不能走到原来的走过的地方,问,输入一个n,有多少种小于n符合题目要求的N的个数。
然后也就是找规律,就是如果这个数是n的约数的,一定会走到曾经走过的地方,因为如果是约数,那么这个数乘一个小于N的数肯定能等于n的倍数。所以在走n次之内一定会走原来的地方,所以把所有次数找出来减去这个就是所求答案。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int vis[1000005];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
int s=0;
for(int i=2;i<=n/2;i++)
{
if(n%i==0)
{
for(int j=i;j<n;j+=i)
{
if(vis[j]==0)
{
vis[j]=1;
s++;
}
}
}
}
if(vis[n]==0)
s++;
cout<<n-s<<endl;
}
return 0;
}