Cod sursa(job #137832)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 17 februarie 2008 15:07:44
Problema Koba Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#include <math.h>

long t1, t2, t3, ut1, ut2, ut3, n, p, aux, suma, sumr, a[1024], v[16][16][16], vb1, num, sol;

int main() {
	freopen("koba.in", "r", stdin);
	freopen("koba.out", "w", stdout);
	scanf("%ld\n", &n);
	scanf("%ld %ld %ld\n", &t1, &t2, &t3);
	p = 3;
	ut1 = t1 % 10;ut2 = t2 % 10;ut3 = t3 % 10;
	v[ut1][ut2][ut3] = 1;
	a[1] = ut1;a[2] = a[1] + ut2;a[3] = a[2] + ut3;
	//printf("%ld %ld %ld ", ut1, ut2, ut3);
	while (p < n) {
		++p;
		aux = ut3;
		ut3 = (ut3 + (ut2 * ut1)) % 10;
		ut1 = ut2;
		ut2 = aux;
		a[p] = a[p - 1] + ut3;
		if (v[ut1][ut2][ut3] == 0) {
			v[ut1][ut2][ut3] = p - 2;
		} else {
			if (vb1 == 0) {
				suma = a[v[ut1][ut2][ut3] - 1];
				sumr = a[p - 3] - a[v[ut1][ut2][ut3] - 1];
				vb1 = 1;
				break;
			}
		}
		//printf("%ld ", ut3);
	}
	//printf("\n");
	//printf("%ld %ld\n", suma, sumr);
	num = (p - 3) - (v[ut1][ut2][ut3] - 1);
	if (n <= v[ut1][ut2][ut3] - 1) {
		printf("%ld\n", a[v[ut1][ut2][ut3] - 1]);
		return 0;
	} else {
		n -= (v[ut1][ut2][ut3] - 1);
		sol = suma + ((n / num) * sumr);
		sol += (a[n % num + (v[ut1][ut2][ut3] - 1)] - suma);
		printf("%ld\n", sol);
	}
	return 0;
}