Cod sursa(job #1840746)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 4 ianuarie 2017 19:52:49
Problema Rsir Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <iostream>
#include <cstdio>
#define MAXMOD 7050

using namespace std;

int t0, t1, a, b, x, y, z, MOD;
int e1[MAXMOD], e2[MAXMOD];
long long n;

struct stare
{
    int t[2];
    stare(int v0 = 0, int v1 = 0)
    {
    	t[0] = v0;
    	t[1] = v1;
    }
    bool operator==(stare s)
    {
        return t[0] == s.t[0] && t[1] == s.t[1];
    }
    bool operator!=(stare s)
    {
    	return !(*this == s);
    }
};

void next(stare &s)
{
    int aux = s.t[1];
    s.t[1] = (e1[s.t[0]] + e2[s.t[1]]);
    if (s.t[1] >= MOD)
		s.t[1] -= MOD;
    s.t[0] = aux;
}

int main()
{
    freopen("rsir.in", "r", stdin);
    freopen("rsir.out", "w", stdout);

    scanf("%d %d %d %d %d %d %d %d %lld", &t0, &t1, &a, &b, &x, &y, &z, &MOD, &n);
    t0 %= MOD; t1 %= MOD; a %= MOD; b %= MOD; x %= MOD; y %= MOD; z %= MOD;
    for (int i = 0; i < MOD; i++) {
        e1[i] = (a*i*i + x*i) % MOD;
        e2[i] = ((b*i*i + y*i) + z) % MOD;
    }
	stare init(t0, t1), p1, p2;
	p1 = p2 = init; next(p2);
	long long ind = 1;
    while (p1 != p2)
	{
		next(p1);
		next(p2), next(p2);
        ind++;
	}
	if (n == 0){
		printf("%d", init.t[0]);
	}
    else if (n <= ind)
    {
        for (int i = 2; i <= n; i++)
            next(init);
        printf("%d", init.t[1]);
    }
    else
	{
		long long block = 0;
		p1 = init; next(p2);
		while (p1 != p2) {
            next(p1);
            next(p2);
            block++;
		}
        n -= block;
        n %= ind;
        if (n == 0) n = ind;
        for (int i = 2; i <= n; i++)
			next(init);
        printf("%d", init.t[1]);

	}

    return 0;
}