Cod sursa(job #972692)

Utilizator vendettaSalajan Razvan vendetta Data 12 iulie 2013 14:30:44
Problema Koba Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("koba.in");
ofstream g("koba.out");

#define nmax 10000

int n, v[nmax];

int v2[nmax];

int main(){
    f >> n >> v[1] >> v[2] >> v[3];
    v[1] = v[1] % 10;
    v[2] %=  10;
    v[3] %=  10;
    /*
    cout << v[1] % 10 << " " << v[2] % 10 << " " << v[3] % 10 << " ";
    cout << v[1]% 10 << " " << 000 << "\n";
    cout << v[2]% 10 << " " << v[1] << 00 << "\n";
    cout << v[3]% 10 << " " << v[2] << v[1] << 0 << "\n";
    */ int First = 0; int Last = 0;
    for(int i=4; i<=n; ++i){
        v[i] = v[i-1] + v[i-2] * v[i-3];
        //cout << v[i] % 10 << " ";
        v[i] = v[i] % 10;
        //cout << i << " " << v[i] << " " << v[i-1] << v[i-2] << v[i-3] << "\n";
        if (v2[ (v[i-1]*10+v[i-2])*10+v[i-3] ] != 0) { First = v2[ (v[i-1]*10+v[i-2])*10+v[i-3] ]; Last = i-1;break;}
        else v2[ (v[i-1]*10+v[i-2])*10+v[i-3] ] = i;
    }
    n -= (First-1);
    long long S = 0LL;
    for(int i=1; i<=First-1; ++i) S += (long long)v[i];
    long long s2 = 0LL;
    for(int i=First; i<=Last; ++i) s2 += (long long)v[i];
    int cat = n / (Last - First + 1);
    int rest = n % (Last - First + 1);
    S += (s2 * (long long)cat);
    for(int i=First; i<=First+rest-1; ++i) S += v[i];
    g << S << "\n";
}