Cod sursa(job #2329773)

Utilizator papinub2Papa Valentin papinub2 Data 27 ianuarie 2019 14:03:48
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <vector>
#define MOD 666013

using namespace std;

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

void Multiply (vector<vector<long long> >&A, vector<vector<long long> >&B)
{
    int row = A.size();
    int col = A[0].size();
    vector<vector<long long> > C(row, vector<long long>(col));

    for (int i = 0; i < row; i++)
        for (int j = 0; j < 2; j++)
            for (int w = 0; w < 2; w++)
                C[i][j] = (C[i][j] + A[i][w] * B[w][j]) % MOD;

    for (int i = 0; i < row; i++)
        for (int j = 0; j < col; j++)
            A[i][j] = C[i][j];
}

int main()
{
    int n;
    in >> n;

    vector<vector<long long> > Sol(1, vector<long long>(2));
    vector<vector<long long> > Mat(2, vector<long long>(2));

    Mat[0][0] = 0;
    Mat[0][1] = 1;
    Mat[1][0] = 1;
    Mat[1][1] = 1;

    Sol[0][0] = 0;
    Sol[0][1] = 1;

    for (int i = 0; (1<<i) <= n; i++)
    {
        if ((1<<i)&n)
            Multiply(Sol, Mat);
        Multiply(Mat, Mat);
    }

    out << Sol[0][0];
    return 0;
}