Cod sursa(job #1382756)

Utilizator Toast97Calin Farcas Toast97 Data 9 martie 2015 15:27:06
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>

using namespace std;

ifstream f ("kfib.in");
ofstream g ("kfib.out");

const int MOD = 666013;

long long A[3][3], B[3][3], Z[3][3], k;

void inmulteste (long long X[3][3], long long Y[3][3])
{
    Z[1][1] = (((X[1][1] % MOD) * (Y[1][1] % MOD) % MOD) + ((X[1][2] % MOD) * (Y[2][1] % MOD)) % MOD) % MOD;
    Z[1][2] = (((X[1][1] % MOD) * (Y[1][2] % MOD) % MOD) + ((X[1][2] % MOD) * (Y[2][2] % MOD)) % MOD) % MOD;
    Z[2][1] = (((X[2][1] % MOD) * (Y[1][1] % MOD) % MOD) + ((X[2][2] % MOD) * (Y[2][1] % MOD)) % MOD) % MOD;
    Z[2][2] = (((X[2][1] % MOD) * (Y[1][2] % MOD) % MOD) + ((X[2][2] % MOD) * (Y[2][2] % MOD)) % MOD) % MOD;

    X[1][1] = Z[1][1];
    X[1][2] = Z[1][2];
    X[2][1] = Z[2][1];
    X[2][2] = Z[2][2];
}

int main()
{
    f >> k;

    A[1][1] = A[2][2] = 1;
    B[1][2] = B[2][1] = B[2][2] = 1;

    while (k)
    {
        if (k & 1)
            inmulteste (A, B);

        k /= 2;
        inmulteste (B, B);
    }

    g << A[2][1] % MOD;

    f.close ();
    g.close ();
    return 0;
}