题意:
一头狼和一头兔子在一座山中,给你一个数n表示洞的个数,编号从0~n-1.兔子可以随意躲在其中一个洞中,狼每次都从编号为0的洞出发,接下来走到第m个洞中,问兔子能不能活下来,即不被狼吃掉.例如:当n = 8,m = 6时,狼走过的洞途径:0->6->4->0->6......,它没走过的洞还有1,2,3,5,7,所以兔子可以存活下来.
分析:
狼会一直在这n个洞中来回,它的模数就是n;它走过的圈数会增加且只有这一个变量,所以可以想到模线性方程组. mx ≡ k(mod n),x表示圈数,k表示洞的编号。变一下形:mx - k = ny(这个式子应该很容易得出,mx与k关于模n同余,mx = n*b + r, k = n*b' + r'; 同余那么r == r',所以mx - k = n*(b-b') => mx - k = ny). 贝祖等式: mx - ny = gcd(m, n). 模线性方程要有解,则k%gcd(m, n) == 0(k>0且k为正整数),当gcd(m, n) = 1时,k从0~n-1中任取一个数都可以使得k%gcd(m, n)==0,所以此时兔子只有一条路就是死路;否则兔子可以存活下来.
代码如下:
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <fstream>
5 #include <ctime>
6 #include <cmath>
7 #include <cstdlib>
8 #include <algorithm>
9 #include <set>
10 #include <map>
11 #include <list>
12 #include <stack>
13 #include <queue>
14 #include <iterator>
15 #include <vector>
16
17 using namespace std;
18
19 #define LL long long
20 #define MOD 1000000007
21 #define INF 0x3f3f3f3f
22 #define MAXN 10000010
23 #define MAXM 1000010
24 #define inf 0x7fffffffffffffff
25 #define maxf 0x7fffffff
26
27
28 LL gcd(LL a, LL b)
29 {
30 return b == 0? a : gcd(b, a%b);
31 }
32
33 int main()
34 {
35 //如果n与m没有互素或者它们的公约数只有1
36 int t;
37 int m, n;
38 scanf("%d", &t);
39 while(t--)
40 {
41 scanf("%d%d", &m, &n);
42 if(gcd(m,n) == 1)
43 printf("NO
");
44 else
45 printf("YES
");
46 }
47
48 return 0;
49 }