Cod sursa(job #2393750)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 31 martie 2019 22:55:07
Problema Koba Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
using namespace std;
ifstream fin("koba.in");
ofstream fout("koba.out");
int t1,t2,t3,t4,n,i,j,aux,f[1001],S,cicluri,stotal,sciclu,scoada;
int v[5000],k,nrciclu,nrcoada;
int main(){
    fin>>n>>t1>>t2>>t3;
    t1%=10;t2%=10;t3%=10;
    if(n==1){fout<<t1;return 0;}
    else if(n==2){fout<<t1+t2;return 0;}
    else if(n==3){fout<<t1+t2+t3;return 0;}
    stotal=t1+t2+t3;
    v[++k]=t1;
    v[++k]=t2;
    v[++k]=t3;
    for(;;){
        aux=t1*100+t2*10+t3;
        f[aux]++;
        t4=(t3+t2*t1)%10;
        v[++k]=t4;
        stotal+=t4;
        t1=t2;
        t2=t3;
        t3=t4;
        if(f[aux]==2){
//s-a incheiat ciclul, il mai parcurgem o data ca sa ii calc suma
            sciclu=t4;
            for(;;){
                nrciclu++;
                aux=t1*100+t2*10+t3;
                f[aux]++;
                if(f[aux]==3)
                    break;
                t4=(t3+t2*t1)%10;
                sciclu+=t4;
                t1=t2;
                t2=t3;
                t3=t4;
            }
            break;
        }
    }
    scoada=stotal-sciclu;
    nrcoada=k-nrciclu;
    if(n<=nrcoada){
        for(i=1;i<=n;i++)
            S+=v[i];
        fout<<S;
        return 0;
    }
    S=scoada;
    n-=nrcoada;
    cicluri=n/nrciclu;
    S+=cicluri*sciclu;
    n-=cicluri*nrciclu;
    if(n)for(i=nrcoada+1;n;n--,i++)
        S+=v[i];
    fout<<S;
    return 0;
}