Cod sursa(job #1665201)

Utilizator alexge50alexX AleX alexge50 Data 26 martie 2016 17:58:19
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <stdio.h>
#define A 0
#define B 1
#define C 2
#define D 3
#define MOD 666013

struct matrix2x2
{
    long long int m[2][2];

    matrix2x2(){}
    matrix2x2(long long int a, long long int b, long int c, long int d)
    {
        long long *_m = &m[0][0];
        _m[0] = a, _m[1] = b, _m[2] = c, _m[3] = d;
    }

    matrix2x2(const matrix2x2 &a)
    {
        m[0][0] = a.m[0][0], m[1][0] = a.m[1][0], m[0][1] = a.m[0][1], m[1][1] = a.m[1][1];
    }

    void print()
    {
        printf("%d %d\n", m[0][0], m[0][1]);
        printf("%d %d\n", m[1][0], m[1][1]);
    }

    matrix2x2 operator*(const matrix2x2& a)
    {
        const long long int *m1 = &m[0][0], *m2 = &a.m[0][0];
        return matrix2x2(
                         (m1[A] * m2[A] + m1[B] * m2[C]) % MOD,
                         (m1[A] * m2[B] + m1[B] * m2[D]) % MOD,
                         (m1[C] * m2[A] + m1[D] * m2[C]) % MOD,
                         (m1[C] * m2[B] + m1[D] * m2[D]) % MOD
                        );
    }

    int operator[](int a)
    {
        return (&m[0][0])[a];
    }

};

matrix2x2 pow(matrix2x2 a, long long int b)
{
    if(b == 1)
        return a;
    matrix2x2 c = pow(a, b / 2);
    if(b % 2 == 0)
        return c * c;
    else return (c * c) * a;

}

matrix2x2 Z(0, 1, 1, 1), init(0, 1, 0, 0);

int main()
{
    FILE *fin = fopen("kfib.in", "r"),
         *fout = fopen("kfib.out", "w");
    long long int n;

    fscanf(fin, "%lld", &n);
    fprintf(fout, "%lld", (init * pow(Z, n))[A]);

    fclose(fin);
    fclose(fout);
    return 0;
}