标签:
1 /*
2 数论/暴力:找出第一次到a1,a2的次数,再找到完整周期p1,p2,然后以2*m为范围
3 t1,t2为各自起点开始“赛跑”,谁落后谁加一个周期,等到t1 == t2结束
4 详细解释:http://blog.csdn.net/u014357885/article/details/46044287
5 */
6 #include <cstdio>
7 #include <algorithm>
8 #include <cstring>
9 #include <iostream>
10 using namespace std;
11
12 typedef long long ll;
13
14 const int MAXN = 1e3 + 10;
15 const int INF = 0x3f3f3f3f;
16
17 int main(void) //Codeforces Round #305 (Div. 2) C. Mike and Frog
18 {
19 int m;
20 ll h1, a1, x1, y1, h2, a2, x2, y2;
21 while (scanf ("%d%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d", &m, &h1, &a1, &x1, &y1, &h2, &a2, &x2, &y2) == 9)
22 {
23 ll t1 = -1, t2 = -1, p1 = -1, p2 = -1;
24 for (int i=1; i<=m; ++i) //get t1, p1
25 {
26 h1 = (h1 * x1 + y1) % m;
27 if (h1 == a1) {t1 = i; break;}
28 }
29 if (t1 == -1) {puts ("-1"); continue;}
30 for (int i=1; i<=m; ++i)
31 {
32 h1 = (h1 * x1 + y1) % m;
33 if (h1 == a1) {p1 = i; break;}
34 }
35
36 for (int i=1; i<=m; ++i) //get t2, p2
37 {
38 h2 = (h2 * x2 + y2) % m;
39 if (h2 == a2) {t2 = i; break;}
40 }
41 if (t2 == -1) {puts ("-1"); continue;}
42 for (int i=1; i<=m; ++i)
43 {
44 h2 = (h2 * x2 + y2) % m;
45 if (h2 == a2) {p2 = i; break;}
46 }
47
48 bool ok = false; //get t1 == t2
49 for (int i=1; i<=2*m; ++i)
50 {
51 if (t1 == t2) {ok = true; printf ("%I64d\n", t1); break;}
52 if (t1 < t2) t1 += p1;
53 else t2 += p2;
54 }
55 if (!ok) puts ("-1");
56 }
57
58 return 0;
59 }
60
61 /*
62 5
63 4 2
64 1 1
65 0 1
66 2 3
67 1023
68 1 2
69 1 0
70 1 2
71 1 1
72 */
数论/暴力 Codeforces Round #305 (Div. 2) C. Mike and Frog
标签:
原文地址:http://www.cnblogs.com/Running-Time/p/4534183.html