sgu 455. Sequence analysis (floyd 判圈算法,O(1)空间复杂度求循环节)
455. Sequence analysis
比赛的时候逗了,往看空间限制了....
直接开了个set判重。。。显然MLE 了。。。
然后这道题的正解是 floyd判圈算法(也叫龟兔算法?)
http://www.cnblogs.com/oyking/p/4286916.html 这份题解讲得很详细
1 /*************************************************************************
2 > File Name: code/2015summer/#5/CC.cpp
3 > Author: 111qqz
4 > Email: rkz2013@126.com
5 > Created Time: 2015年07月30日 星期四 21时02分17秒
6 ************************************************************************/
7 #include<iostream>
8 #include<iomanip>
9 #include<cstdio>
10 #include<algorithm>
11 #include<cmath>
12 #include<cstring>
13 #include<string>
14 #include<map>
15 #include<set>
16 #include<queue>
17 #include<vector>
18 #include<stack>
19 #define y0 abc111qqz
20 #define y1 hust111qqz
21 #define yn hez111qqz
22 #define j1 cute111qqz
23 #define tm crazy111qqz
24 #define lr dying111qqz
25 using namespace std;
26 #define REP(i, n) for (int i=0;i<int(n);++i)
27 typedef long long LL;
28 typedef unsigned long long ULL;
29 const int inf = 0x7fffffff;
30 const int LIM = 2E6;
31 LL a,b,c;
32 LL next (LL x)
33 {
34 return (a*x+x%b)%c;
35 }
36 int main()
37 {
38 cin>>a>>b>>c;
39 LL x = next(1);
40 LL y = next(next(1));
41 int v = 1;
42 while (v<=LIM &&x!=y)
43 {
44 x = next(x); //乌龟走一步
45 y = next(next(y)); //兔子走两步
46 v++;
47 }
48 if (v>LIM) //在规定范围内找不到循环节(兔子没有和乌龟到同一个位置)
49 {
50 puts("-1");
51 return 0;
52 }
53
54 x = 1;
55 int mu = 0; //找到循环节的起点
56 while (x!=y)
57 {
58 x = next(x);
59 y = next(y);
60 mu++;
61 }
62
63 int lam = 1; //循环节的长度
64 y = next(x);
65 while (mu+lam <= LIM &&x!=y)
66 {
67 y = next(y);
68 lam++;
69 }
70 if (mu+lam<=LIM)
71 {
72 printf("%d\n",mu+lam);
73 }
74 else
75 {
76 puts("-1");
77 }
78
79 return 0;
80 }
81
82