Cod sursa(job #2236302)

Utilizator lucametehauDart Monkey lucametehau Data 29 august 2018 08:22:21
Problema Rsir Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>

using namespace std;

ifstream cin ("rsir.in");
ofstream cout ("rsir.out");

const int MMAX = 7e3;
typedef pair <int, int> pii;

int t0, t1, a, b, x, y, z, mod;
long long n;
int cnt1, cnt2;
pii p0, p1;

int v[2][1 + MMAX];

pii nxt(pii p) {
  if(v[0][p.first] + v[1][p.second] >= mod)
    return {p.second, v[0][p.first] + v[1][p.second] - mod};
  return {p.second, v[0][p.first] + v[1][p.second]};
}

int sol(int ind) {
  for(int i = 1; i <= ind; i++)
    p0 = nxt(p0);
  return p0.first;
}

int main() {
  cin >> t0 >> t1 >> a >> b >> x >> y >> z >> mod >> n;
  t0 %= mod;
  t1 %= mod;
  for(int i = 0; i < mod; i++) {
    v[0][i] = ((1LL * (i * i % mod) * a) % mod + (1LL * x * i % mod) + z) % mod;
    v[1][i] = ((1LL * (i * i % mod) * b) % mod + (1LL * y * i % mod)) % mod;
  }
  p0 = {t0, t1};
  p0 = nxt(p0);
  p1 = nxt(p0);
  while(p0 != p1) {
    p0 = nxt(p0);
    p1 = nxt(nxt(p1));
  }
  p0 = {t0, t1};
  while(p0 != p1) {
    p0 = nxt(p0);
    p1 = nxt(p1);
    cnt1++;
  }
  p1 = nxt(p0);
  cnt2 = 1;
  while(p0 != p1) {
    p1 = nxt(p1);
    cnt2++;
  }
  p0 = {t1, t0};
  if(n < cnt1)
    cout << sol(n);
  else
    cout << sol(cnt1 + (n - cnt1) % cnt2);
  return 0;
}