Cod sursa(job #1992313)

Utilizator MaligMamaliga cu smantana Malig Data 20 iunie 2017 08:13:21
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>

using namespace std;
ifstream in("kfib.in");
ofstream out("kfib.out");

#define ll long long
#define pb push_back
const int inf = 1e9 + 5;
const int NMax = 3e6 + 5;
const int mod = 666013;

int K;

void prod(ll[2][2],ll[2][2]);
void pw(ll[2][2],int);

int main() {

    /*
    int a[2][2] = {1,2,3,4};
    for (int i=0;i<2;++i) {
        for (int j=0;j<2;++j) {
            cout<<a[i][j]<<' ';
        }
        cout<<'\n';
    }

    test(a);

    for (int i=0;i<2;++i) {
        for (int j=0;j<2;++j) {
            cout<<a[i][j]<<' ';
        }
        cout<<'\n';
    }
    */

    in>>K;

    ll a[2][2] = {0,1,1,1};
    ll b[2][2] = {0,0,1,0};

    pw(a,K);
    prod(a,b);

    out<<a[0][0]<<'\n';

    in.close();out.close();
    return 0;
}

void prod(ll a[2][2],ll b[2][2]) {
    ll ans[2][2] = {};

    for (int i=0;i < 2;++i) {
        for (int j=0;j < 2;++j) {
            for (int k=0;k < 2;++k) {
                ans[i][j] = (ans[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] = ans[i][j];
        }
    }
}

void pw(ll base[2][2],int exp) {
    ll ans[2][2] = {1,0,0,1};

    while (exp) {
        if (exp & 1) {
            prod(ans,base);
        }
        prod(base,base);
        exp >>= 1;
    }

    for (int i=0;i < 2;++i) {
        for (int j=0;j < 2;++j) {
            base[i][j] = ans[i][j];
        }
    }
}