Cod sursa(job #2155638)

Utilizator NeredesinI am not real Neredesin Data 7 martie 2018 23:04:19
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <iostream>
#include <fstream>

using namespace std;

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

typedef long long ll;

const int NMAX = 7 * 1e3;

int t0, t1, a, b, x, y, z, m;
int res, l0, l1;
int v1[1 + NMAX];
int v2[1 + NMAX];
ll n;

int main()
{
  in >> t0 >> t1 >> a >> b >> x >> y >> z >> m >> n;

  t0 %= m;
  t1 %= m;

  for(int i = 0; i < m; i++) {
    v1[i] = (1LL * i * x + 1LL * i * i % m * a) % m;
    v2[i] = (1LL * i * y + 1LL * i * i % m * b) % m;
  }

  for(int i = 1; i <= min(n, 1LL * m * m); i++) {
    int j = v1[t0] + v2[t1] + z;
    while(j >= m)
      j -= m;
    t0 = t1;
    t1 = j;
  }

  if(m * m < n) {
    res = 0;
    l0 = t0;
    l1 = t1;

    for(int i = 1; i <= n - m * m && res == 0; i++) {
      int j = v1[t0] + v2[t1] + z;
      while(j >= m)
        j -= m;
      t0 = t1;
      t1 = j;

      if(l0 == t0 && l1 == t1)
        res = i;
    }

    n = (n - m * m) % res;
    for(int i = 1; i <= n; i++){
      int j = v1[t0] + v2[t1] + z;
      while(j >= m)
        j -= m;
      t0 = t1;
      t1 = j;
    }
  }

  out << t0 << '\n';

  in.close();
  out.close();
  return 0;
}