Cod sursa(job #1001163)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 24 septembrie 2013 17:01:28
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
using namespace std;
ifstream f("kfib.in");
ofstream g("kfib.out");
int n;
unsigned long long a[3][3]={{0,0,0},{0,1,1},{0,1,0}};
unsigned long long b[3][3],m[3][2];

void inmultire(unsigned long long e[][3],unsigned long long b[][3],unsigned long long c[][3]){
    c[1][1]=((e[1][1]*b[1][1])%666013+(e[1][2]*b[2][1])%666013)%666013;
    c[1][2]=((e[1][1]*b[1][2])%666013+(e[1][2]*b[2][2])%666013)%666013;
    c[2][1]=((e[2][1]*b[1][1])%666013+(e[2][2]*b[2][1])%666013)%666013;
    c[2][2]=((e[2][1]*b[1][2])%666013+(e[2][2]*b[2][2])%666013)%666013;
}

void copiere(unsigned long long a[][3],unsigned long long c[][3]){
    a[1][1]=c[1][1];
    a[1][2]=c[1][2];
    a[2][1]=c[2][1];
    a[2][2]=c[2][2];
}

void up(int x){
    unsigned long long p[3][3]={{0,0,0},{0,1,1},{0,1,0}};
    unsigned long long s[3][3]={{0,0,0},{0,1,0},{0,0,1}},q[3][3];
    while(x!=0){
        if(x%2){
            inmultire(s,p,q);
            copiere(s,q);
        }
        x/=2;
        inmultire(p,p,q);
        copiere(p,q);
    }
    copiere(a,s);
}

int main(void){
    register int i,j;

    f>>n;
    up(n-2);
    g<<(a[1][1]+a[1][2])%666013;
    return 0;
}