Cod sursa(job #1824974)

Utilizator raulmuresanRaul Muresan raulmuresan Data 8 decembrie 2016 17:14:06
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<fstream>
#include<vector>
#include<string>
#define modulo 666013

using namespace std;

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


string sir;
int i, n, k, j,contor,st,dr,sol,x,y;
int frec[250];
int a[3][3], b[3][3];

void copy(int a[3][3], int b[3][3])
{
    for(int i = 1; i <= 2; i++)
        for(int j = 1; j <= 2; j++)
            a[i][j] = b[i][j];
}


void inmultire(int a[3][3], int b[3][3])
{
    int c[3][3];
    int i, j, k;
    long long s;
    for(i = 1; i <= 2; i++)
        for(j = 1; j <= 2; j++)
        {
            s = 0;
            for(k = 1; k <= 2; k++)
                s += (1LL* a[i][k] * b[k][j]);
            c[i][j] = s % modulo;
        }
    copy(a, c);
}



void putere (int a[3][3], int p)
{
    int c[3][3];
    c[1][1] = c[2][2] = 1;
    c[1][2] = c[2][1] = 0;
    //c[1][2] = c[2][1] = c[2][2] = 1;
    while(p)
    {
        if(p % 2 == 1)
        {
            inmultire(c, a);
            p--;
        }
        inmultire(a, a);
        p /= 2;
    }
    copy(a, c);
}

int main()
{
    fin >> n;

    a[1][2] = 1;
    b[1][2] = b[2][1] = b[2][2] = 1;
    //vom ridica matricea B la puterea (n - 1)
     if(n == 0)
     {
         fout << "0\n";
     }
     else
     {
        putere(b, n);
        inmultire(a, b);
        fout << a[1][1]<<"\n";
     }

}