Cod sursa(job #69126)

Utilizator floringh06Florin Ghesu floringh06 Data 1 iulie 2007 13:46:03
Problema Rsir Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
using namespace std;
#include <stdio.h>
#define LL long long
LL N;
int t0, t1, a, b, x, y, z, M;
int tt0, tt1, tt2;
int tf0, tf1;
int mod[10000];

inline int get(int tt0, int tt1)
{
	return (a * mod[tt0] + b * mod[tt1] + x * tt0 + y * tt1 + z) % M;
}
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, &M, &N);
	t0 %= M;
	t1 %= M;
	int i;
	for (i = 0; i < M; i++) mod[i] = (i * i) % M;
	if (N == 0) {
		printf("%d\n", t0);
		return 0;
	}
	if (N == 1) {
		printf("%d\n", t1);
		return 0;
	}
	tt0 = t0;
	tt1 = t1;
	int lim = M * M + 1;
	for (i = 2; i <= lim; i++) {
		tt2 = get(tt0, tt1);
		tt0 = tt1; 
		tt1 = tt2;
		if (i == N) {
			printf("%d\n", tt1);
			return 0;
		}
	}
	tf0 = tt0; tf1 = tt1;
	tt0 = t0; tt1 = t1;
	for (i = 2; i <= lim; i++) {
		tt2 = get(tt0, tt1);
		if (tt1 == tf0 && tt2 == tf1) break;
		tt0 = tt1;
		tt1 = tt2;
	}
	N -= i - 1;
	N %= lim - i;
	if (!N) {
		printf("%d\n", tt1);
		return 0;
	}
	tt0 = tt1; tt1 = tt2;
	for (i = 2; i <= N; i++) {
		tt2 = get(tt0, tt1);
		tt0 = tt1;
		tt1 = tt2;
	}
	printf("%d\n", tt1);
fclose(stdin);
fclose(stdout);
return 0;
}