Cod sursa(job #2021498)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 13 septembrie 2017 19:57:30
Problema Koba Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("koba.in");
ofstream g("koba.out");
int n,a,b,c,a1,b1,c1,sol,d1,d,sp[13*13*13];
int mat[12][12][12],fa[12][12][12];
int main()
{
    f>>n>>a>>b>>c;
    a%=10;
    b%=10;
    c%=10;
    a1=a;
    b1=b;
    c1=c;
    int q=4;
    bool ok=1;
    while(ok && q<=n)
    {
        d=(c+a*b)%10;
        if(mat[d][c][b]==0)
            mat[d][c][b]=1,fa[d][c][b]=q;
        else{
            ok=0;break;
        }
        ++q;
        a=b;
        b=c;
        c=d;
    }
    if(ok==1){
        sol+=a1+b1+c1;
        for(int i=4;i<=n;++i){
            d1=(c1+a1*b1)%10;
            a1=b1;
            b1=c1;
            c1=d1;
            sol+=d1;
        }
        g<<sol;
    }
    else
    {
        fa[d][c][b]-=2;
        q-=2;
        if(fa[d][c][b]==3)
            sol+=a1+b1;
        else
            if(fa[d][c][b]==2)
                sol+=a1;
            else
                if(fa[d][c][b]>=4){
                    sol+=a1+b1+c1;
                    for(int i=4;i<fa[d][c][b];++i)
                    {
                        d1=(c1+a1*b1)%10;
                        a1=b1;
                        b1=c1;
                        c1=d1;
                        sol+=d1;
                    }
                }
        int r=0;
        for(int i=fa[d][c][b];i<q;++i)
        {
            d1=(c1+a1*b1)%10;
            a1=b1;
            b1=c1;
            c1=d1;
            ++r;
            sp[r]=sp[r-1]+d1;
        }
        q-=fa[d][c][b];
        while(fa[d][c][b]+q<=n)
            sol+=sp[q],fa[d][c][b]+=q;
        sol+=sp[n-fa[d][c][b]+1];
        g<<sol;
    }
    return 0;
}