Cod sursa(job #2640188)

Utilizator eugen5092eugen barbulescu eugen5092 Data 5 august 2020 16:08:45
Problema Al k-lea termen Fibonacci Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
#define MOD 666013
using namespace std;

ifstream ci("kfib.in");
ofstream cou("kfib.out");

long long n;
//mi = m1 * z^i-1
long long v[3][3];//sol fin
long long sol[3][3];//sol la fct aia
long long p[3][3];

void afis(long long t[3][3]){
    for(long long i=1;i<=2;i++){
        for(long long j=1;j<=2;j++){
            cout<<t[i][j]<<" ";
        }
        cout<<"\n";
    }
}

void ridicamatrice(long long a[3][3],long long b[3][3]){

    sol[1][1]=a[1][1]*b[1][1]+a[1][2]*b[2][1];
    sol[1][2]=a[1][1]*b[1][2]+a[1][2]*b[2][2];
    sol[2][1]=a[2][1]*b[1][1]+a[2][2]*b[1][2];
    sol[2][2]=a[1][2]*b[2][1]+a[2][2]*b[2][2];

}


void ridlaput(long long put){
    //calc z^i-1
    //p = solutia
    //v = x
    while(put){
        if(put%2==1){
            ridicamatrice(p,v);
            p[1][1]=sol[1][1]%MOD;
            p[2][1]=sol[2][1]%MOD;
            p[1][2]=sol[1][2]%MOD;
            p[2][2]=sol[2][2]%MOD;
        }
        put=put/2;
        ridicamatrice(v,v);
        //sol e v^2;
        v[1][1]=sol[1][1]%MOD;
        v[2][1]=sol[2][1]%MOD;
        v[1][2]=sol[1][2]%MOD;
        v[2][2]=sol[2][2]%MOD;

    }
}

int main()
{
    ci>>n;
    long long rez;
    v[1][1]=0;
    v[1][2]=1;
    v[2][1]=1;
    v[2][2]=1;

    p[1][1]=0;
    p[1][2]=1;
    p[2][1]=1;
    p[2][2]=1;

    ci>>n;
    ridlaput(n-3);

    //mi = m1 * z^i-1
    //m1=(1,1)

    rez=p[1][2]*1+p[2][2]*1;
    cou<<rez;

    return 0;
}