Cod sursa(job #2126603)

Utilizator tanasaradutanasaradu tanasaradu Data 9 februarie 2018 19:18:10
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("kfib.in");
ofstream fout ("kfib.out");
const short var = 2;
const int Mod  = 666013;
int a[var + 2][var + 2] , v[var + 2][var + 2] , k;
inline void Inmult(int aux[var + 2][var + 2] , int aux1[var + 2][var + 2])
{
    int c[var + 2][var + 2];
    long long s;
    for(int i = 1 ; i <= var ; i++)
        for(int j = 1 ; j <= var ; j++)
        {
            s = 0;
            for(int k = 1 ; k <= var ; k++)
                s += (1LL * aux[i][k] * aux1[k][j]);
            c[i][j] = s % Mod;
        }
    for(int i = 1 ; i <= var ; i++)
        for(int j = 1 ; j <= var ; j++)
            aux[i][j] = c[i][j];
}
inline void LGPUT(int n)
{
    int unit[var + 2][var + 2];
    unit[1][1] = 0;
    unit[1][var] = unit[var][1] = unit[var][var] = 1;
    while(n > 0)
    {
        if(n % 2 == 1)
            Inmult(unit , v);
        n /= 2;
        Inmult(v , v);
    }
    for(int i = 1 ; i <= var ; i++)
            for(int j = 1 ; j <= var ; j++)
                v[i][j] = unit[i][j];
}
int main()
{
    fin >> k;
    a[1][var] = 1;
    v[1][var] = v[var][1] = v[var][var] = 1;
    LGPUT(k - 2);
    Inmult(a , v);
    fout << a[1][var] << "\n";
    fin.close();
    fout.close();
    return 0;
}