Pagini recente » Cod sursa (job #481298) | Cod sursa (job #1017189) | Cod sursa (job #2973684) | Cod sursa (job #2634069) | Cod sursa (job #138436)
Cod sursa(job #138436)
#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;
}