Cod sursa(job #2252524)

Utilizator crion1999Anitei cristi crion1999 Data 2 octombrie 2018 19:46:19
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>
#define MOD 666013
using namespace std;
ifstream fi("kfib.in");
ofstream fo("kfib.out");

struct Mat
{
    long long a11, a12, a21, a22;
};

Mat LgPut(Mat a, int n)
{
    Mat sol;
    sol.a11 = 1;
    sol.a12 = 0;
    sol.a21 = 0;
    sol.a22 = 1;
    Mat aux;
    while(n)
    {
        if( n & 1)
        {
            aux = sol;
            sol.a11 = (aux.a11 * a.a11 + aux.a12 * a.a21)% MOD;
            sol.a12 = (aux.a11 * a.a12  + aux.a12 * a.a22)% MOD;
            sol.a21 = (aux.a21 * a.a11  + aux.a22 * a.a21)% MOD;
            sol.a22 = (aux.a12 * a.a21 + aux.a22 * a.a22)% MOD;
        }

        n /= 2;
        aux = a;
        a.a11 = (aux.a11 * aux.a11 + aux.a12 * aux.a21)% MOD;
        a.a12 = (aux.a11 * aux.a12  + aux.a12 * aux.a22)% MOD;
        a.a21 = (aux.a21 * aux.a11  + aux.a22 * aux.a21)% MOD;
        a.a22 = (aux.a12 * aux.a21 + aux.a22 * aux.a22)% MOD;
    }
    return sol;
}
int main()
{
    int n;
    fi>>n;
    Mat s;
    s.a11 = 1;
    s.a12 = 1;
    s.a21 = 1;
    s.a22 = 0;
    s = LgPut(s,n-1);
    fo << s.a11;
}