Cod sursa(job #3224303)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 15 aprilie 2024 09:28:19
Problema Koba Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("txt.in");
ofstream fout("txt.out");
const int mod = 10;
int n, m, i, t1, t2, t3, t[10002];
int sum[10002], lp, r;
int fr[12][12][12];

static inline void Calc(int &t1, int &t2, int &t3) {
    int _t = (t1 + t2 * t3 % mod) % mod;

    t3 = t2;
    t2 = t1;
    t1 = _t;
}

int main() {
    fin >> n >> t3 >> t2 >> t1;

    t1 %= mod;
    t2 %= mod;
    t3 %= mod;

    t[1] = t3;
    t[2] = t2;
    t[3] = t1;

    fr[0][0][t3] = 1;
    fr[0][t2][t3] = 2;
    fr[t1][t2][t3] = 3;

    lp = 3;
    int incPer, m;
    while(true) {
        lp++;
        Calc(t1, t2, t3);

        if(fr[t1][t2][t3] != 0) {
            incPer = fr[t1][t2][t3];
            m = lp - incPer;
            break;
        }

        fr[t1][t2][t3] = lp;
        t[lp] = t1;
    }

    for(i = 1; i <= lp; i++) sum[i] = t[i] + sum[i - 1];

    if(n < incPer) fout << sum[n];
    else {
        r += sum[incPer - 1];
        int sumPer = sum[lp - 1] - sum[incPer - 1];
        r += ((n - (incPer - 1)) / m) * sumPer;
        int rest = (n - (incPer - 1)) % m;
        for(i = incPer; i <= incPer + rest - 1; i++) r += t[i];
        fout << r;
    }

    return 0;
}