Cod sursa(job #577949)

Utilizator TeodoraTanaseTeodora Tanase TeodoraTanase Data 10 aprilie 2011 20:08:25
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <cstdio>

using namespace std;

long long a[3][3]={0,0,0,0,0,1,0,1,1}, r[3][3]={0,0,0,0,0,1,0,1,1};
int k;
const int m=666013;

void inm(long long a[3][3],long long b[3][3])
{
    long long x1, x2, x3, x4;
    x1=(a[1][1]*b[1][1])%m+(a[1][2]*b[2][1])%m;
    x2=(a[1][1]*b[1][2])%m+(a[1][2]*b[2][2])%m;
    x3=(a[2][1]*b[1][1])%m+(a[2][2]*b[2][1])%m;
    x4=(a[2][1]*b[2][1])%m+(a[2][2]*b[2][2])%m;
    a[1][1]=x1%m;
    a[1][2]=x2%m;
    a[2][1]=x3%m;
    a[2][2]=x4%m;
}

void putere(int k)
{
    if (k==1)
    {
        inm(r,a);
        return;
    }
    if (k%2)
    {
        inm(r,a);
        putere(k-1);
    }
    else
    {
        inm(a,a);
        putere(k/2);
    }
}

int main()
{
    freopen ("kfib.in","r",stdin);
    freopen ("kfib.out","w",stdout);
    scanf ("%d ",&k);
    k-=2;
    putere(k);
    printf ("%lld\n",r[2][2]);
    return 0;
}