Cod sursa(job #1990775)

Utilizator ayenamKiritescu Andrei ayenam Data 13 iunie 2017 15:48:31
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream in("kfib.in");
ofstream out("kfib.out");

long long ans[3][3];
void mat(long long n[][3], long long m[][3], long long p[][3])
{

    p[1][1]=(n[1][1]*m[1][1]+n[1][2]*m[2][1])%666013;
    p[1][2]=(n[1][1]*m[1][2]+n[1][2]*m[2][2])%666013;
    p[2][1]=(n[2][1]*m[1][1]+n[2][2]*m[2][1])%666013;
    p[2][2]=(n[2][1]*m[1][2]+n[2][2]*m[2][2])%666013;
}
long long p[3][3];
void rid(long long x[][3], long long k)
{
    while(k!=0)
    {if(k%2!=0)
    {
        mat(ans,x,p);
        ans[1][1]=p[1][1]; ans[1][2]=p[1][2]; ans[2][1]=p[2][1]; ans[2][2]=p[2][2];
        k--;
    }
    mat(x,x,p);
    x[1][1]=p[1][1]; x[1][2]=p[1][2]; x[2][1]=p[2][1]; x[2][2]=p[2][2];
    k=k/2;
}}

int main()
{
 ans[1][1]=1; ans[1][2]=0; ans[2][1]=0; ans[2][2]=1;
long long x[3][3];
 x[1][1]=0; x[1][2]=1; x[2][1]=1; x[2][2]=1;

 long long k; in>>k;

rid(x,k-2);


long long m[3][3]; m[1][1]=0; m[1][2]=1;
mat(m,ans,x);

out<<(x[1][1]+x[1][2])%666013;




}