Cod sursa(job #1110558)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 18 februarie 2014 10:33:39
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
#include <cstring>
#define mod 666013

using namespace std;
int n, z[3][3], a[3][3];
void putere_log(int x, int m[][3]);
void multi(int a[][3], int b[][3], int c[][3]);
int main()
{
    freopen("kfib.in", "r", stdin);
    freopen("kfib.out", "w", stdout);
    scanf("%d", &n);
    z[0][0]=0;
    z[1][1]=1;
    z[1][0]=1;
    z[0][1]=1;
    putere_log(n-1, a);
    printf("%d\n", a[1][1]);
    return 0;
}
void putere_log(int x, int m[][3])
{
    int i, c[3][3], aux[3][3];
    memcpy(c, z, sizeof(z));
    m[0][0]=0;
    m[1][1]=1;
    for(i=0;(1<<i)<=x;i++)
    {
        if(x&(1<<i))
        {
            memset(aux, 0, sizeof(aux));
            multi(m, c, aux);
            memcpy(m, aux, sizeof(aux));
        }
        memset(aux, 0, sizeof(aux));
        multi(c, c, aux);
        memcpy(c, aux, sizeof(c));
    }
}
void multi(int a[][3], int b[][3], int c[][3])
{
    int i, j, k;
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
            for(k=0;k<2;k++)
                 c[i][j]=(c[i][j]+1LL*a[i][k]*b[k][j])%mod;
}