Cod sursa(job #808530)

Utilizator andunhillMacarescu Sebastian andunhill Data 6 noiembrie 2012 21:14:50
Problema Koba Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#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];
    T[0] %= 10; T[1] %= 10; T[2] %= 10;
    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;
}