Cod sursa(job #1735275)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 29 iulie 2016 13:48:00
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
# include <fstream>
# define MOD 666013
using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
long long a[2][2]={{1,1},{1,0}};
long long b[2][2];
long long k[2][2]={{1,0},{0,1}};
int n;
void copiere(long long a[2][2],long long b[2][2]){
    for(int i=0;i<=1;i++)
        for(int j=0;j<=1;j++)
            a[i][j]=b[i][j];
}
void inmultire(long long a[2][2],long long b[2][2],long long c[2][2]){
    for(int i=0;i<=1;i++)
        for(int j=0;j<=1;j++){
            c[i][j]=0;
            for(int k=0;k<=1;k++){
                c[i][j]+=a[i][k]*b[k][j];
                c[i][j]%=MOD;
            }
        }
}
int main () {
    fin>>n;
    if(n<=2){
        if(n==0)
            fout<<"0\n";
        else
            fout<<"1\n";
        return 0;
    }
    n-=2;
    while(n){
        if(n&1){
            inmultire(k,a,b);
            copiere(k,b);
        }
        inmultire(a,a,b);
        copiere(a,b);
        n/=2;
    }
    fout<<(k[0][0]+k[0][1])%MOD<<"\n";
    return 0;
}