Cod sursa(job #1152396)

Utilizator teoionescuIonescu Teodor teoionescu Data 24 martie 2014 18:13:11
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<fstream>
using namespace std;
ifstream in("kfib.in");
ofstream out("kfib.out");
const int MOD = 666013;
struct mat{
    int a[3][3];
    mat(){}
    mat(int aa,int ab,int ba,int bb){
        a[1][1]=aa;
        a[1][2]=ab;
        a[2][1]=ba;
        a[2][2]=bb;
    }
    mat operator * (mat X){
        mat S;
        S.a[1][1]= ( 1LL*a[1][1]*X.a[1][1] + 1LL*a[1][2]*X.a[2][1] )%MOD;
        S.a[1][2]= ( 1LL*a[1][1]*X.a[1][2] + 1LL*a[1][2]*X.a[2][2] )%MOD;
        S.a[2][1]= ( 1LL*a[2][1]*X.a[1][1] + 1LL*a[2][2]*X.a[2][1] )%MOD;
        S.a[2][2]= ( 1LL*a[2][1]*X.a[1][2] + 1LL*a[2][2]*X.a[2][2] )%MOD;
        return S;
    }
};
mat logpow(mat B,int k){
    mat A=mat(1,0,0,1);
    for(int e=0;(1<<e)<=k;e++){
        if(k&(1<<e)) A=A*B;
        B=B*B;
    }
    return A;
}
int K;
int main(){
    mat Z=mat(1,1,1,0);
    in>>K;
    Z=logpow(Z,K-2);
    out<<(Z.a[1][1]+Z.a[2][1])%MOD;
    return 0;
}