Cod sursa(job #3152693)

Utilizator SSKMFSS KMF SSKMF Data 26 septembrie 2023 12:26:09
Problema Koba Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
using namespace std;

ifstream cin ("koba.in");
ofstream cout ("koba.out");

int gasit[10][10][10];

int Suma(int termen_1 , int termen_2 , int termen_3 , int lungime)
{
    int suma = 0;
    for (int indice = 1 ; indice <= lungime ; indice++)
    {
        suma += termen_1;
        const int urmatorul = (termen_3 + termen_2 * termen_1) % 10;
        termen_1 = termen_2; termen_2 = termen_3; termen_3 = urmatorul;
    }

    return suma;
}

int main ()
{
    int lungime , termen_1 , termen_2 , termen_3;
    cin >> lungime >> termen_1 >> termen_2 >> termen_3;

    gasit[termen_1 %= 10][termen_2 %= 10][termen_3 %= 10] = 1;
    int perioada = 2 , _termen_1 = termen_2 , _termen_2 = termen_3 , _termen_3 = (termen_3 + termen_2 * termen_1) % 10;
    while (!gasit[_termen_1][_termen_2][_termen_3])
    {
        gasit[_termen_1][_termen_2][_termen_3] = perioada++;
        const int urmatorul = (_termen_3 + _termen_2 * _termen_1) % 10;
        _termen_1 = _termen_2; _termen_2 = _termen_3; _termen_3 = urmatorul;
    }
    
    int suma = Suma(termen_1 , termen_2 , termen_3 , min(gasit[_termen_1][_termen_2][_termen_3] - 1 , lungime));
    lungime = max(0 , lungime - gasit[_termen_1][_termen_2][_termen_3] + 1);

    if ((perioada -= gasit[_termen_1][_termen_2][_termen_3]) <= lungime) {
        suma += lungime / perioada * Suma(_termen_1 , _termen_2 , _termen_3 , perioada);
        lungime %= perioada;
    }

    cout << (suma += Suma(_termen_1 , _termen_2 , _termen_3 , lungime));
    cout.close(); cin.close();
    return 0;
}