HDU 1222

题意:

  一头狼和一头兔子在一座山中,给你一个数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 }
原文地址:https://www.cnblogs.com/xl1164191281/p/5747102.html