Cod sursa(job #3323237)

Utilizator TeodoRazvanStancu Teodor-Razvan TeodoRazvan Data 17 noiembrie 2025 19:59:34
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>

using namespace std;

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

const int ms=5,MOD=666013;

long long int ans[ms][ms],inm[ms][ms],aux[ms][ms],rez[ms][ms];

void prod(long long int a[ms][ms],long long int b[ms][ms],long long int r[ms][ms],int n,int m,int p){
    for(int i=1;i<=m;i++){
        for(int j=1;j<=m;j++){
            aux[i][j]=0;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            for(int k=1;k<=p;k++){
                aux[i][j]=(aux[i][j]+a[i][k]*b[k][j])%MOD;
            }
        }
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=m;j++){
            r[i][j]=aux[i][j];
        }
    }
}

void lgput(long long int m[ms][ms],int n,int e){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            rez[i][j]=0;
        }
    }
    for(int i=1;i<=n;i++) rez[i][i]=1;
    while(e!=0){
        if(e%2==1){
            prod(rez,m,rez,n,n,n);
        }
        prod(m,m,m,n,n,n);
        e/=2;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            m[i][j]=rez[i][j];
        }
    }
}
int main(){
    int n;
    fin>>n;
    inm[1][1]=1;
    inm[1][2]=1;
    inm[2][1]=1;
    inm[2][2]=0;
    ans[1][1]=1;
    ans[1][1]=1;
    if(n<=1) fout<<ans[1][1];
    else{
        n--;
        lgput(inm,2,n);
        prod(ans,inm,ans,1,2,2);
        fout<<ans[1][1];
    }
    return 0;
}