Cod sursa(job #1238012)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 5 octombrie 2014 14:28:13
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define mod 666013

using namespace std;

int p, sol[5][5], Z[5][5];

void mult(int a[5][5], int b[5][5])
{
    int c[5][5];
    memset(c, 0, sizeof(c));
    for (int i = 0; i < 2; i++)
        for (int j = 0; j < 2; j++)
            for (int k = 0; k < 2; k++)
                c[i][j] = (c[i][j] + (1LL * a[i][k] * b[k][j])%mod)%mod;
    memcpy(a, c, sizeof(c));
}

void out()
{
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
            cerr << sol[i][j] << " ";
        cerr << "\n";
    }
    cerr << sol[1][1];
}

void rise(int p)
{
    if (p == 0) {sol[1][1] = 0; return;}
    if (p == 1 || p == 2) return;
    p -= 2;
    for (int i = 0; (1<<i) <= p; i++)
    {
        if ((p>>i) & 1)
            mult(sol, Z);
        mult(Z, Z);
    }
}

int main()
{
    freopen("kfib.in", "r", stdin);
    freopen("kfib.out", "w", stdout);

    scanf("%d", &p);
    Z[0][1] = Z[1][0] = Z[1][1] = 1;
    memcpy(sol, Z, sizeof(Z));
    //for (int i = 0; i < p-2; i++)
      //  mult(sol, Z);
    rise(p);
    printf("%d\n", sol[1][1]);
    //out();

    return 0;
}