Cod sursa(job #1874748)

Utilizator abccnuCamelia Zalum abccnu Data 10 februarie 2017 13:24:19
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <algorithm>
using namespace std;
const int MOD = 666013;
ifstream cin("kfib.in");
ofstream cout("kfib.out");

void inm(int a[2][2], int b[2][2], int rez[2][2])
{
    int aux[2][2];
    for (int i = 0; i < 2; ++i)
        for (int j = 0; j < 2; ++j)
        {
            long long sum = 0;

            for (int k = 0; k < 2; ++k)
            {
                sum += 1LL * a[i][k] * b[k][j];
            }

            aux[i][j] = sum % MOD;
        }

    rez[0][0] = aux[0][0];
    rez[0][1] = aux[0][1];
    rez[1][0] = aux[1][0];
    rez[1][1] = aux[1][1];
}

void putere(int a[2][2], int k, int rez[2][2])
{
    if (k == 0)
    {
        rez[0][0] = 1;
        rez[0][1] = 0;
        rez[1][0] = 0;
        rez[1][1] = 1;
    }
    else
    {
        if (k % 2 == 1)
        {
            putere(a, k - 1, rez);
            inm(a, rez, rez);
        }
        else
        {
            putere(a, k / 2, rez);
            inm(rez, rez, rez);
        }
    }
}

int main()
{
    int a[2][2], rez[2][2];

    a[0][0] = 0;
    a[0][1] = 1;
    a[1][0] = 1;
    a[1][1] = 1;

    int n;

    cin >> n;
    putere(a, n-2, rez);
    cout << (rez[0][1] + rez[1][1]) % MOD << "\n";

    return 0;
}