Cod sursa(job #1808438)

Utilizator Y.MalmsteenB.P.M. Y.Malmsteen Data 17 noiembrie 2016 18:07:10
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>

using namespace std;
const int MOD = 666013;

struct MAT //Matrice patratica de ordin 2, simetrica
{
    long long a11, a12, a22;
};

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

void mul(MAT &A, MAT &B) // A <-- A*B
{
    long long x = A.a11 * B.a11 + A.a12 * B.a12;
    long long y = A.a11 * B.a12 + A.a12 * B.a22;
    long long z = A.a12 * B.a12 + A.a22 * B.a22;
    A.a11 = x % MOD;
    A.a12 = y % MOD;
    A.a22 = z % MOD;
}

int putere(int n)
{
    MAT A = {0, 1, 1}, P = {1, 0, 1};
    while(n > 0)
    {
        while(n % 2 == 0)
        {
            mul(A, A);
            n /= 2;
        }
        mul(P, A);
        n--;
    }
    return P.a22;
}

int main()
{
    int K;
    f >> K;
    if(K > 0)
        g << putere(K - 1);
    else
        g << '0';
    f.close();
    g.close();
    return 0;
}