Cod sursa(job #2280646)

Utilizator StefanTifreaStefan Tifrea StefanTifrea Data 10 noiembrie 2018 22:31:29
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
int k;
void f_squared(int f[2][2])
{
    int f1[2][2];
    f1[0][0] = f[0][0] * f[0][0] + f[0][1] * f[1][0];
    f1[0][1] = f[0][0] * f[0][1] + f[0][1] * f[1][1];
    f1[1][0] = f[1][0] * f[0][0] + f[1][1] * f[1][0];
    f1[1][1] = f[1][0] * f[0][1] + f[1][1] * f[1][1];
    f[0][0] = f1[0][0];
    f[0][1] = f1[0][1];
    f[1][0] = f1[1][0];
    f[1][1] = f1[1][1];
}
void f_multiply(int f[2][2],int x[2][2])
{
    int f1[2][2];
    f1[0][0] = f[0][0] * x[0][0] + f[0][1] * x[1][0];
    f1[0][1] = f[0][0] * x[0][1] + f[0][1] * x[1][1];
    f1[1][0] = f[1][0] * x[0][0] + f[1][1] * x[1][0];
    f1[1][1] = f[1][0] * x[0][1] + f[1][1] * x[1][1];
    f[0][0] = f1[0][0];
    f[0][1] = f1[0][1];
    f[1][0] = f1[1][0];
    f[1][1] = f1[1][1];
}
int main()
{
    fin>>k;
    if(k==0)
        fout<<0;
    else
    {
        int f[2][2],p=1,a[2][2];
        f[0][0] = 0;
        f[0][1] = 1;
        f[1][0] = 1;
        f[1][1] = 1;
        a[0][0] = 0;
        a[0][1] = 1;
        a[1][0] = 1;
        a[1][1] = 1;
        for(int i=2;i<=k;i=i*2)
            f_squared(f),p=i;
        for(int j=p+1;j<=k;j++)
            f_multiply(f,a);
        fout<<f[1][0];
    }
    return 0;
}