Cod sursa(job #3356458)

Utilizator Car13Carmi Carabas Car13 Data 1 iunie 2026 15:07:08
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

#define MOD 660634

typedef struct{
    vector <int> z1 = {1, 0};
    vector <int> z2 = {0, 1};
}MATRICE;

MATRICE inmultire_M(MATRICE m, MATRICE n){
    MATRICE rez;
    rez.z1[0] = (m.z1[0] * n.z1[0] + m.z2[0] * n.z1[1]) % MOD;
    rez.z1[1] = (m.z1[1] * n.z1[0] + m.z2[1] * n.z1[1]) % MOD;
    rez.z2[0] = (m.z1[0] * n.z2[0] + m.z2[0] * n.z2[1]) % MOD;
    rez.z2[1] = (m.z1[1] * n.z2[0] + m.z2[1] * n.z2[1]) % MOD;
    return rez;
}

MATRICE logexp(MATRICE i, MATRICE z, int p){
    cout << z.z1[0] << endl << z.z1[1] << endl << z.z2[0] << endl << z.z2[1] << endl << endl;
    if (p == 0){
        return i;
    }
    if(p % 2 == 0){
        return logexp(i, inmultire_M(z, z), p / 2);
    }
    if(p % 2 == 1){
        return inmultire_M(z, logexp(i, inmultire_M(z, z), p / 2));
    }
}

int main (){
    vector <int> m1 = {0, 1};
    int k;
    MATRICE z, r, i;
    fin >> k;
    cout << k;
    z.z1[0] = 0;
    z.z1[1] = 1;
    z.z2[0] = 1;
    z.z2[1] = 1;
    r = logexp(i, z, k - 1);
    k = r.z2[1] % MOD;
    fout << k;
    fin.close();
    fout.close();
    return 0;
}