Cod sursa(job #2534286)

Utilizator RedXtreme45Catalin RedXtreme45 Data 30 ianuarie 2020 12:44:36
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <cstring>
#define mod 666013
using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
long long int n,M[3][3],SOL[3][3];
void inmult(long long int A[][3],long long int B[0][3],long long int C[][3])
{
    for (int i=0;i<=1;i++)
    {
        for (int j=0;j<=1;j++)
        {
            for (int k=0;k<=1;k++)
            {
                C[i][j]=(C[i][j]+A[i][k]*B[k][j])%mod;
            }
        }
    }
}
void ridicare(int p){
    long long int AUX[3][3],A[3][3];
    memcpy(A,M,sizeof A);
    SOL[1][1]=SOL[0][0]=1;
    for (long long int i=0;(1<<i)<=p;i++)
    {
        if (p &(1<<i))
        {
            memset(AUX,0,sizeof AUX);
            inmult(SOL,A,AUX);
            memcpy(SOL,AUX,sizeof AUX);
        }
            memset(AUX,0,sizeof AUX);
            inmult(A,A,AUX);
            memcpy(A,AUX,sizeof AUX);
    }
}

int main()
{
    fin>>n;
    M[0][0]=0;
    M[0][1]=1;
    M[1][0]=1;
    M[1][1]=1;
    ridicare(n-1);
    fout<<SOL[1][1];
    return 0;
}