http://acm.nyist.net/JudgeOnline/problem.php?pid=317
兔子的烦恼(二)
时间限制:
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 22 2
样例输出
-
NO1 1
-
有多组测试数据,不超过11组;
#include<iostream>
using namespace std;
int gcd(int a, int b) {
int r;
while (b) {
r = a % b;
a = b;
b = r;
}
return a;
}
int main() {
int m, n;
while (cin >> m >> n) {
if (gcd(m, n) == 1) cout << "NO" << endl;
else {
cout << n - n / gcd(m, n) << " "; //求出总数
for (int i = 1; i <= n; i++) {
if (i % gcd(m, n) != 0) cout << i << " "; //遍历每个山洞
}
cout << endl;
}
}
}
有一个结论,如果(m, n)=1,则mk可以遍历n的剩余系,否则不能,所以,如果(m, n)=1,则可以遍历所有的山东,否则不可以