题目链接:
代码:
#include<stdio.h>
int GCD(int n,int m)
{
return m?GCD(m,n%m):n;
}
int main()
{
int n,m,i;
while(~scanf("%d%d",&m,&n))
{
if(GCD(n,m)==1)
{
printf("NO\n");
}
else
{
int t=GCD(n,m);
printf("%d",n-n/t);
for(i=1;i<n;++i) //第0个洞一定会经过,所以i从1开始
if(i%t!=0)
printf(" %d",i);
printf("\n");
}
}
return 0;
}
解题思路:
对于n与m的最大公约数的倍数 经过多次循环 狼都能遍访到
所以: 令t=GCD(n,m)
则: 0t, 1t, 2t, 3t ,........kt [kt<n] 都不是安全的洞,总共有k+1个;
==>> k=(n-1)/t;
==>> 兔子可躲避的洞穴 个数N = n-k-1 = (n-1)-(n-1)/t;
又: n一定能整除 t ,n-1一定不能被 t 整除 [当 t 不等于 1 时],
所以: (n-1)/t==n/t-1;
则: n-1-(n-1)/t == n - n/t;