Cod sursa(job #2374941)

Utilizator qwerty1234qwerty qwerty1234 Data 7 martie 2019 21:22:30
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <bits/stdc++.h>

using namespace std;

const short var = 2;

const int Mod = 666013;

ifstream fin ("kfib.in");
ofstream fout ("kfib.out");

int a[var + 1][var + 1], unit[var + 1][var + 1], n, b[var + 1][var + 1] , c[var + 1][var + 1];

inline void Lgput(int n)
{
    int s;
    unit[1][1] = unit[var][var] = 1;
    while(n)
    {
        if(n & 1)
        {
            for(int i = 1 ; i <= var ; i++)
                for(int j = 1 ; j <= var ; j++)
                {
                    s = 0;
                    for(int k = 1 ; k <= var ; k++)
                        s = (s + 1LL * unit[i][k] * b[k][j] % Mod) % Mod;
                    c[i][j] = s;
                }
            for(int i = 1 ; i <= var ; i++)
                for(int j = 1 ; j <= var ; j++)
                    unit[i][j] = c[i][j];
        }
        n /= 2;
        for(int i = 1 ; i <= var ; i++)
            for(int j = 1 ; j <= var ; j++)
            {
                s = 0;
                for(int k = 1 ; k <= var ; k++)
                    s = (s + 1LL * b[i][k] * b[k][j] % Mod) % Mod;
                c[i][j] = s;
            }
        for(int i = 1 ; i <= var ; i++)
            for(int j = 1 ; j <= var ; j++)
                b[i][j] = c[i][j];
    }
    for(int i = 1 ; i <= var ; i++)
        for(int j = 1 ; j <= var ; j++)
            b[i][j] = unit[i][j];
}

int main()
{
    fin >> n;
    if(n == 1 || n == 2)
        fout << "1\n";
    else
    {
        a[1][1] = a[1][var] = 1;
        b[1][var] = b[2][1] = b[2][var] = 1;
        Lgput(n - 2);
        for(int i = 1 ; i <= var ; i++)
            for(int j = 1 ; j <= var ; j++)
            {
                int s = 0;
                for(int k = 1 ; k <= var ; k++)
                    s = (s + 1LL * a[i][k] * b[k][j] % Mod) % Mod;
                c[i][j] = s;
            }
        for(int i = 1 ; i <= var ; i++)
            for(int j = 1 ; j <= var ; j++)
                a[i][j] = c[i][j];
        fout << a[1][var] << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}