Cod sursa(job #1821712)

Utilizator BrandonChris Luntraru Brandon Data 3 decembrie 2016 15:05:40
Problema Rsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>

#define LL long long
using namespace std;

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

const int MaxM = 7005;

LL t0, t1, a, b, x, y, z, M, n, tprev, tcurr, tprev2, tcurr2, CycleLength = 1;
LL A[MaxM], B[MaxM];

inline void NextElement(LL &tm2, LL &tm1) {
  LL NewT = A[tm2] + B[tm1] + z;
  while (NewT >= M) {
    NewT -= M;
  }
  tm2 = tm1;
  tm1 = NewT;
}

int main() {
  freopen("rsir.in", "r", stdin);
  freopen("rsir.out", "w", stdout);
  //cin >> t0 >> t1 >> a >> b >> x >> y >> z >> M >> n;
  scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d", &t0, &t1, &a, &b, &x, &y, &z, &M, &n);

  for (int i = 0; i < M; ++i) {
    A[i] = (a * i * i + x * i) % M;
    B[i] = (b * i * i + y * i) % M;
  }

  t0 %= M;
  t1 %= M;
  tprev = t0;
  tcurr = t1;
  for (CycleLength = 0; CycleLength < n and CycleLength < M * M; ++CycleLength) {
    NextElement(tprev, tcurr);
  }

  if (CycleLength == n) {
    //cout << tprev << '\n';
    printf("%I64d\n", tprev);
    return 0;
  }

  n -= CycleLength;
  CycleLength = 0;
  tprev2 = tprev;
  tcurr2 = tcurr;
  do {
    NextElement(tprev2, tcurr2);
    ++CycleLength;
  } while (tprev2 != tprev or tcurr2 != tcurr);

  n %= CycleLength;
  for (int i = 1; i < n; ++i) {
    NextElement(tprev, tcurr);
  }
  //cout << tcurr << '\n';
  printf("%I64d\n", tcurr);
  return 0;
}