Cod sursa(job #1471427)

Utilizator ancabdBadiu Anca ancabd Data 13 august 2015 21:01:25
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>

using namespace std;

ifstream fin ("kfib.in");
ofstream fout ("kfib.out");

long int x[2][2], rez[2][2], p[2][2], er;
long long c[2][2];

void inmultire(long int a[2][2], long int b[2][2])
{
    long long jk2, jk;

    jk = a[0][0]%666013;
    jk*= b[0][0]%666013;
    jk%=666013;

    jk2 = a[0][1]%666013;
    jk2*= b[1][0]%666013;
    jk2%=666013;

    c[0][0]=(jk+ jk2)%666013;

    // 2
    jk = a[0][0]%666013;
    jk*= b[0][1]%666013;
    jk%=666013;

    jk2 = a[0][1]%666013;
    jk2*= b[1][1]%666013;
    jk2%=666013;

    c[0][1]=(jk + jk2)%666013;

    //3
    jk = a[1][0]%666013;
    jk*= b[0][0]%666013;
    jk%=666013;

    jk2 = a[1][1]%666013;
    jk2*= b[0][1]%666013;
    jk2%=666013;

    c[1][0]=(jk + jk2)%666013;

    //4
    jk = a[1][0]%666013;
    jk*= b[0][1]%666013;
    jk%=666013;

    jk2 = a[1][1]%666013;
    jk2*= b[1][1]%666013;
    jk2%=666013;

    c[1][1]=(jk + jk2)%666013;
}
void ridicare(long int y)
{
    bool w=0;
    if(y == 1)
        return ;
    for(er = y; er > 0; er = er/2)
    {
        if(er % 2 == 1)
        {
            if (w == 1)inmultire(rez, p);
            w = 1;
            for (int i = 0; i<2; i++)
                for (int j = 0; j<2; j++)rez[i][j]=c[i][j]%666013;
        }
        inmultire(p, p);
        for (int i = 0; i<2; i++)
            for (int j = 0; j<2; j++)p[i][j]=c[i][j]%666013;
    }
    return;
}

int main()
{
    long int k;

    fin >> k;

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

    c[0][1]=1;
    c[1][0]=1;
    c[1][1]=1;
    ridicare(k+1);

    fout << rez[0][0];
    return 0;
}