HDU2104(hide handkerchief)
问题链接
题目大意是:N个人围成一个圈,把手帕藏在某个人的箱子中,让Haha去找,Haha每次都会跳过M-1个人,因为Haha走的次数是没有限制的,所以Haha只要遍历所有人就可以找到手帕了。
解题思路:这道题可以理解成给出固定步数和人数,判断Haha是否能够遍历所有盒子。判断是否可以遍历所有盒子的依据是:N和M是否互质(即两者的最大公约数是1)。若不互质,就会有盒子永远不会被遍历到。
最终,问题就转换成了,判读N和M的最大公约数是否为1。
第一次做的时候,一直在想:为什么就非要N和M互质?考虑了很久才想明白,看图能帮助理解。
当有N = 8 个人时,M = 2(跳过一个人)时,此时有四个盒子永远都无法被遍历到。
N不变,M = 3时(跳过两个人时),到最后,Haha能够遍历所有的盒子。
再看当N = 16 ,M = 4时的情况:也是有些不能够遍历到。
其实黄色弧形可以看作是两个红色弧形组合而来,也就是说:N = 16 ,M = 4和
N = 8, M = 2是倍数关系,只要N 和 M的最大公约数不是1,那么就会有盒子永远不会被遍历。
用辗转反侧法来查找N和M的最大公约数 :
int num( int N, int M)
{
int k ;
while( M!= 0 )
{
k = M;
M= N % M;
N = k ;
}
return k ;
}
AC代码:
#include<stdio.h>
int num( int N , int M )
{
int k ;
while( M != 0 )
{
k = M ;
M = N % M ;
N = k ;
}
return k ;
}
int main ( void )
{
int N , M ;
while ( scanf( "%d %d" , &N , &M ) != EOF )
{
if ( N == -1 && M == -1 )
break ;
if ( num ( N , M ) != 1 )
printf( "POOR Haha\n" ) ;
else
printf( "YES\n" ) ;
}
return 0 ;
}