Cod sursa(job #2882671)

Utilizator Matei_MunteanuMunteanu Matei Ioan Matei_Munteanu Data 31 martie 2022 17:57:51
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>
using namespace std;
#define MOD 666013

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

int n;
int start[3][3];
int M[3][3];
void inmultire(int ma1[3][3], int ma2[3][3])
{
    int rez[3][3];
    rez[1][1] = ((ma1[1][1] * ma2[1][1]) % MOD + (ma1[1][2] * ma2[2][1]) % MOD) % MOD;
    rez[1][2] = ((ma1[1][1] * ma2[1][2]) % MOD + (ma1[1][2] * ma2[2][2]) % MOD) % MOD;
    rez[2][1] = ((ma1[2][1] * ma2[1][1]) % MOD + (ma1[2][2] * ma2[2][1]) % MOD) % MOD;
    rez[2][2] = ((ma1[2][1] * ma2[1][2]) % MOD + (ma1[2][2] * ma2[2][2]) % MOD) % MOD;
    for (int i = 1; i <= 2; i++)
    {
        for (int j = 1; j <= 2; j++)
        {
            ma1[i][j] = rez[i][j];
        }
    }
}
void putere(int k)
{
    while(k)
    {
        if (k % 2 == 0)
        {
            k /= 2;
            inmultire(M, M);
        }
        else
        {
            k--;
            inmultire(start, M);
        }
    }
}
int main()
{
    fin >> n;
    start[1][1] = 0;
    start[1][2] = 1;
    M[1][1] = 0;
    M[1][2] = 1;
    M[2][1] = 1;
    M[2][2] = 1;
    putere(n);
    fout << start[1][1];
    return 0;
}