Cod sursa(job #1913079)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 8 martie 2017 11:43:33
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
const int mod = 666013;
int K,a[3][3],b[3][3],z[3][3],u[3][3];

inline void Copy(int x[3][3], int y[3][3])
{
    for(int i = 1; i <= 2; i++)
        for(int j = 1; j <= 2; j++)
            x[i][j] = y[i][j];
}

inline void Reset(int x[3][3])
{
    for(int i = 1; i <= 2; i++)
        for(int j = 1; j <= 2; j++)
            x[i][j] = 0;
}


inline void MultMat(int x[3][3], int y[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* x[i][k] * y[k][j]);
        c[i][j] = s%mod;
    }
    Copy(x,c);
}
inline void Pow_LG(int p)
{
    Reset(u);
    u[1][1] = u[2][2] = 1;
    while(p)
    {
        if(p & 1)
        {
            --p;
            MultMat(u,b);
        }
        p /= 2;
        MultMat(b,b);
    }
   // Copy(a,u);
}


int main()
{
    fin >> K;
    if(K == 0) fout << 0;
    else if (K <= 2) fout << 1;
    else
    {
        a[1][2] = 1;
        b[1][2] = b[2][1] = b[2][2] = 1;
        Pow_LG(K-1);
        MultMat(a,u);
        fout << a[1][2] << "\n";
    }
    fout << "\n";
    fout.close();
    return 0;
}