Cod sursa(job #917136)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 17 martie 2013 13:03:26
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <cstring>
#define mod 666013
FILE *f=fopen("kfib.in","r");
FILE *g=fopen("kfib.out","w");
using namespace std;
long long n,m,t1,t2,t3,m3[2][2],m4[2][2];

long long mult1(long long m1[2][2],long long m2[2][2])
{
    int i,j,k;
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
            for(k=0;k<2;k++)
                 m3[i][j]=(m3[i][j]+m1[i][k]*m2[k][j])%mod;
}
long long mult2(long long m1[2][2],long long m2[2][2])
{
    int i,j,k;
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
            for(k=0;k<2;k++)
                 m4[i][j]=(m4[i][j]+m1[i][k]*m2[k][j])%mod;
}

long long cmmdc(long long a,long long b)
{
    long long r;
    while(b)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}

long long fibo(long long x)
{
    long long m1[2][2],m0[2][2];
    m1[0][0]=m1[0][1]=m1[1][0]=1;m1[1][1]=0;
    m0[0][0]=m0[0][1]=m0[1][0]=1;m0[1][1]=0;
    if(x==0)return 0;
    if(x==1)return 1;
    while(x>1)
    {
        if(x%2==0)
            {
                mult1(m1,m1);
                memcpy(m1,m3,sizeof(m3));
                memset(m3,0,sizeof(m3));
                x/=2;
            }
        else
            if(x%2==1)
            {
                mult2(m1,m0);
                memcpy(m0,m4,sizeof(m4));
                memset(m4,0,sizeof(m4));
                x--;
            }

    }
    mult1(m1,m0);
    memcpy(m1,m3,sizeof(m3));
    return m1[1][1];
}
int main()
{
     long long x;
    fscanf(f,"%lld",&x);
    fprintf(g,"%lld",fibo(x));
    return 0;
}