Cod sursa(job #1599595)

Utilizator TrascaAndreiTrasca Andrei TrascaAndrei Data 14 februarie 2016 00:38:27
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

const int MOD = 666013;
const char inf[] = "kfib.in";
const char outf[] = "kfib.out";

long long fib[2][2],z[2][2];
int n;

FILE *in=fopen(inf,"r"),*out=fopen(outf,"w");


void inmult(long long a[2][2],long long b[2][2],long long c[2][2])
{
    int i, j, k;
    for(i = 0; i < 2; i++)
        for(j = 0; j < 2; j++)
        {
            c[i][j] = 0;
            for(k = 0; k < 2; k++)
                c[i][j] += a[i][k] * b[k][j];
        }
    for(i = 0; i < 2; i++)
        for(j = 0; j < 2; j++)
            a[i][j] = c[i][j] % MOD;
}

void pow(int k)
{
    long long rez[2][2];
    while(k)
    {
        if(k%2==1) inmult(fib,z,rez);
        inmult(z,z,rez);
        k=k/2;
    }
}


int main()
{
    fscanf(in,"%d",&n);
    z[1][0]=z[1][1]=z[0][1]=1;
    fib[0][0]=fib[1][1]=1;
    pow(++n);
    fprintf(out,"%d",fib[0][0]);
    return 0;
}