Pagini recente » Cod sursa (job #2701557) | Cod sursa (job #3330292) | Cod sursa (job #1096038) | Cod sursa (job #1032595) | Cod sursa (job #3356462)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
#define MOD 666013
typedef struct{
vector <long long> z1 = {1, 0};
vector <long long> z2 = {0, 1};
}MATRICE;
MATRICE inmultire_M(MATRICE m, MATRICE n){
MATRICE rez;
rez.z1[0] = ((m.z1[0] * n.z1[0]) % MOD + (m.z2[0] * n.z1[1]) % MOD) % MOD;
rez.z1[1] = ((m.z1[1] * n.z1[0]) % MOD + (m.z2[1] * n.z1[1]) % MOD) % MOD;
rez.z2[0] = ((m.z1[0] * n.z2[0]) % MOD + (m.z2[0] * n.z2[1]) % MOD) % MOD;
rez.z2[1] = ((m.z1[1] * n.z2[0]) % MOD + (m.z2[1] * n.z2[1]) % MOD) % 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));
}
return i;
}
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);
fout << r.z2[1];
fin.close();
fout.close();
return 0;
}