Cod sursa(job #456988)

Utilizator vladiiIonescu Vlad vladii Data 17 mai 2010 16:53:00
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
using namespace std;
#define maxm 7010

typedef pair<int, int> PII;
long long N;
int start, len;
int T0, T1, a, b, x, y, z, M;
int V1[maxm], V2[maxm];

inline PII next(PII a) {
    int res = V1[a.first] + V2[a.second];
    if(res >= M) res -= M;
    return make_pair(a.second, res);
}

int main() {
    FILE *f1=fopen("rsir.in", "r"), *f2=fopen("rsir.out", "w");
    int i, j;
    PII e1, e2;
    fscanf(f1, "%d %d %d %d %d %d %d %d %lld\n", &T0, &T1, &a, &b, &x, &y, &z, &M, &N);
    T0 %= M; T1 %= M; a %= M; b %= M; x %= M; y %= M; z %= M; 
    for(i=0; i<M; i++) {
         V1[i] = ((i*i)%M * a + i*x) % M;
         V2[i] = ((i*i)%M * b + y*i + z) % M;
    }
    e1 = make_pair(T0, T1);
    e2 = next(e1);
    while(e1 != e2) {
         e1 = next(e1);
         e2 = next(next(e2));
    }
    e2 = make_pair(T0, T1);
    while(e2 != e1) {
         e2 = next(e2);
         start++;
    }
    e2 = next(e1); len = 1;
    while(e2 != e1) {
         e2 = next(e2);
         len++;
    }
    if(N <= start) {
         e2 = make_pair(T0, T1);
         for(i=1; i<=N; i++) {
              e2 = next(e2);
         }
         fprintf(f2, "%d\n", e2.first);
    }
    else {
         N -= start; N %= len;
         while(N) {
              e1 = next(e1);
              N--;
         }
         fprintf(f2, "%d\n", e1.first);
    }
    fclose(f1); fclose(f2);
    return 0;
}