Cod sursa(job #922794)

Utilizator ard_procesoareLupicu ard_procesoare Data 22 martie 2013 17:33:12
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
//#include <iostream>
using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
long long z[2][2];
long long aux[2][2],rez[2][2];
#define MODULO 666013
int k;
long long check(long long val)
{
    while(val>MODULO)
        val -= MODULO;
    return val;
}
void fx(long long a[2][2],long long b[2][2])   //  A <- B*A;
{
    int c[2][2];
    c[0][0] = check(a[0][0]*b[0][0]) + check(a[1][0]*b[0][1]);
    c[1][0] = check(a[0][0]*b[1][0]) + check(a[1][0]*b[1][1]);
    c[0][1] = check(a[0][0]*b[0][1]) + check(a[0][1]*b[1][1]);
    c[1][1] = check(a[1][0]*b[0][1]) + check(a[1][1]*b[1][1]);
    for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
            {
                a[i][j] = c[i][j];
                if(a[i][j] > MODULO) a[i][j] -= MODULO;
                if(b[i][j] > MODULO) b[i][j] -= MODULO;
            }
}
void logx(int pow)
{
    aux[1][1] = aux[0][0] = 1;
    int rez2=2,aux2=1;
    while(pow)
    {
        if(pow%2 == 1)
        {
            fx(aux , rez);
           //aux2 = rez2*aux2;
        }
        pow = pow / 2;
        if(pow)
            //rez2=rez2*rez2;
            fx(rez , rez);
    }
}
void solve()
{
    logx(k-1);
    //for(int i=0;i<2;i++)
    //    for(int j=0;j<2;j++)
      //      fout<<aux[i][j]<<" ";
    fout<<(aux[1][0] + aux[0][0])%MODULO;
}
void init()
{
    rez[0][0] = z[0][0] = 0;
    rez[1][0] = z[1][0] = 1;
    rez[1][1] = z[1][1] = 1;
    rez[0][1] = z[0][1] = 1;
    fin>>k;
}
int main()
{
    init();
    solve();

//    fout<<logx(11);
}