Cod sursa(job #138436)

Utilizator marius135Dumitran Adrian Marius marius135 Data 18 februarie 2008 17:20:05
Problema Koba Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<stdio.h>

long n,v[102400],t[16][16][16],s[102400];

long solve1()
{
	s[2] = v[2] + v[1];
	s[3] = s[2] + v[3];
	if( n == 1)
		return v[1];
	if( n == 2)
		return s[2];
	if( n == 3)
		return s[3];
	for(long i = 4; i <= n; ++i)
	{
		v[i] = (v[i-1] + v[i-2] * v[i-3])%10;
		s[i] = s[i-1] + v[i];
	}
	return s[n];
}

long solve2()
{
	
	s[1] = v[1];
	s[2] = v[2] + v[1];
	s[3] = s[2] + v[3];
	
	t[v[1]][v[2]][v[3]] = 1;
	
	for( long i = 4; i < 1024; ++i)
	{
		v[i] = (v[i-1] + v[i-2] * v[i-3])%10;
		s[i] = s[i-1] + v[i];
		if( t[v[i-2]][v[i-1]][v[i]] )
		{
			long ciclust = t[v[i-2]][v[i-1]][v[i]] , cicludr = i-3 , valciclu = s[cicludr] - s[ciclust-1];
			long sol = s[ciclust-1];
			n-= ciclust-1;
			sol+= valciclu * (n/(cicludr-ciclust+1));
			n%= (cicludr-ciclust +1);
			sol += s[n+ciclust-1] - s[ciclust-1];
			return sol;
			
		}
		else t[v[i-2]][v[i-1]][v[i]] = i-2;
	}
}

int main()
{
	freopen("koba.in","r",stdin);
	freopen("koba.out","w",stdout);
	
	scanf("%ld %ld %ld %ld",&n,&v[1],&v[2],&v[3]);
	
	/*if( n <= 5000000)
	{
		printf("%ld\n",solve1());
	}*/
	else	printf("%ld\n",solve2());
	
	
	
	
	
	
	return 0;
}