兔子的烦恼(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
在一座山上有n个山洞(每个洞从0~n-1分别编号),这山上有一只兔子躲在山洞里,有一只狼,从编号为0的山洞开始入洞,每隔m-1个洞,再次入洞抓兔子,现在兔子想知道是否有能避免这场灾难的山洞?
例如:m=2 and n=6, 狼将要进入的山洞号为:0,2,4,可避难的山洞为:1,3,5;
- 输入
- 有多组测试数据,不超过11组;
每组有两个整数m,n(0<m,n<=10000000);
注意:程序以文件结束符“EOF”结束输入。 输出 - 兔子能避免这场灾难输出可避难山洞的总数和所有可避难山洞的编号(从小到大输出),否则输出NO; 样例输入
-
1 2
-
2 2
样例输出 -
NO
-
1 1
- 有多组测试数据,不超过11组;
这又是一个数学问题,很简单,但是很难理解,你需要知道的是求出两个数的最大公约数temp,如果temp == 1的话 那么就意味着不论转几圈,所有的数总会被转到,
若temp !=1, 意味着转一圈,下标 i % temp 的数不会被进入,总个数怎么求呢,sum = n - n / temp,步长是temp嘛
# include <stdio.h>
# include <memory.h>
int a[10000005];
int gcd(int a, int b);
int main()
{
int n, m;
while ( scanf("%d %d", &m, &n) != EOF )
{
memset(a, 0, sizeof(a));
int sum = 0, j = 0, i;
int temp = gcd(m, n);
if (temp == 1)
{
printf("NO\n");
}
else
{
sum = n - n/temp;
printf("%d ", sum);
for (i=0; i<n; i++)
{
if (i%temp != 0)
{
printf("%d ", i);
}
}
printf("\n");
}
}
return 0;
}
int gcd(int a, int b)
{
if (0 == b)
return a;
else
return gcd(b, a%b);
}