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;
}