Pagini recente » Cod sursa (job #1142502) | Cod sursa (job #2107831) | Cod sursa (job #151180) | Cod sursa (job #2163614) | Cod sursa (job #808529)
Cod sursa(job #808529)
#include<fstream>
#include<iostream>
#include<iomanip>
#include<ctime>
using namespace std;
clock_t start=clock();
ifstream f("koba.in");
ofstream g("koba.out");
int N, M, n;
int Tinit[3];
int T[3];
int poz[10][10][10];
int bruteT[3];
int main()
{ int i, j, p;
long long Sm = 0, S = 0;
f>>N; n = N;
f>>T[0]>>T[1]>>T[2];
Tinit[0] = bruteT[0] = T[0];
Tinit[1] = bruteT[1] = T[1];
Tinit[2] = bruteT[2] = T[2];
poz[T[0]][T[1]][T[2]] = 3;
for(i = 0; i < N; i++)
{ if(i > 2) T[i % 3] = T[(i - 1) % 3] + T[(i - 2) % 3] * T[(i - 3) % 3];
T[i % 3] %= 10;
if(i < 2)
{ S += T[i % 3]; continue;
}
p = poz[T[(i - 2) % 3]][T[(i - 1) % 3]][T[i % 3]];
if(!p)
poz[T[(i - 2) % 3]][T[(i - 1) % 3]][T[i % 3]] = i;
else
{ Sm = S;
M = i - p;
for(j = 0; j < p; j++)
{ if(j > 2) Tinit[j % 3] = Tinit[(j - 1) % 3] + Tinit[(j - 2) % 3] * Tinit[(j - 3) % 3];
Tinit[j % 3] %= 10;
Sm -= Tinit[j % 3];
}
N -= i;
S = S + Sm * (N / M);
S += T[i % 3];
for(i = i + 1, j = 1; j < N - M * (N / M); j++, i++)
{
T[i % 3] = T[(i - 1) % 3] + T[(i - 2) % 3] * T[(i - 3) % 3];
T[i % 3] %= 10;
S += T[i % 3];
}
break;
}
S += T[i % 3];
}
g<<S;
/*
cout<<"S sol "<<S<<'\n';
int Sbr = 0;
for(i = 0; i < n; i++)
{ if(i > 2) bruteT[i % 3] = bruteT[(i - 1) % 3] + bruteT[(i - 2) % 3] * bruteT[(i - 3) % 3];
bruteT[i % 3] %= 10;
Sbr += bruteT[i % 3];
}
cout<<"S brute "<<Sbr<<'\n';*/
cout << 1.0*(clock()-start)/(1.0*CLOCKS_PER_SEC) << '\n';
f.close();
g.close();
return 0;
}