Codeforces Round #305 (Div. 2) C. Mike and Frog

链接:



首先分别找出两个序列的循环节和循环节的起始位置,如果找到了循环节终点却没有出现,,那么进入循环节终点再也不能出现了。

如果在循环节内我的做法就是算m次之后的每个值,在循环节之前就只有一个值。

#include <iostream>#include <sstream>#include <cstring>#include <cstdio>#include <vector>#include <stack>#include <cmath>#include <queue>#include <map>#include <set>#define lson o<<1,l,m#define rson o<<1|1,m+1,r#define mem(a) memset(a,0,sizeof(a))typedef long long ll;const int N = 2000005;const int M = 10005;const ll mod = 1000000007;const double PI = acos(-1.0);const double eps = 1e-10;using namespace std;int f[N], s[N], st;ll m;ll cal(int* f, ll x, ll y, ll h) {int id = 0;while(1) {f[h] = id++;h = (h * x + y) %m;if(f[h]) {st = f[h];break;}}return id – st;}vector <ll> solve(ll a, ll cl, ll tmp) {vector <ll> t;if(a < tmp) t.push_back(a);else {for(int i = 0; i <= m; i++) {ll x = a + i * cl;t.push_back(x);}}return t;}int main() {ll h1, a1, x1, y1, h2, a2, x2, y2;cin >> m;cin >> h1 >> a1;cin >> x1 >> y1;cin >> h2 >> a2;cin >> x2 >> y2;ll clf = cal(f, x1, y1, h1);int st1 = st;ll cls = cal(s, x2, y2, h2);int st2 = st;if(f[a1] == 0 || s[a2] == 0) {cout << -1 << endl;return 0;}vector<ll> t1 = solve(f[a1], clf, st1);vector<ll> t2 = solve(s[a2], cls, st2);int l = 0, r = 0;while(l < t1.size() && r < t2.size()) {if(t1[l] > t2[r]) {r++;continue;}if(t1[l] < t2[r]) {l++;continue;}cout << t1[l] << endl;return 0;}cout << -1 << endl;return 0;}

生活的最大悲剧不是失败,而是一个人已经习惯于失败。

Codeforces Round #305 (Div. 2) C. Mike and Frog

相关文章:

你感兴趣的文章:

标签云: