Cod sursa(job #3187828)

Utilizator AdrianRosuRosu Adrian Andrei AdrianRosu Data 30 decembrie 2023 17:25:18
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>
#define MOD 666013

using namespace std;

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

long long A[2][2] = { {1, 1}, {0, 0} };

long long C[2][2] = { {0, 1}, {1, 1} };

long long sol[2][2] = { {1, 0}, {0, 1} };

void multiply(long long a[2][2], long long b[2][2]){

    long long c[2][2];

    for(int i=0;i<2;i++)
        for(int j=0;j<2;j++){

            c[i][j] = 0;

            for(int k=0;k<2;k++)
                c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % MOD;


        }

    for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
            a[i][j] = c[i][j];

}

void lg_put(int n){

    while(n){

        if(n % 2 == 1){
            multiply(sol, C);
            n--;
        }

        else {
            multiply(C, C);
            n >>= 1;
        }

    }

}

int n;

int main(){

    fin >> n;

    lg_put(n);

    multiply(sol, A);

    fout << sol[1][0] << "\n";

    return 0;

}