Pagini recente » Cod sursa (job #284153) | Cod sursa (job #2380474) | Cod sursa (job #990772) | Cod sursa (job #1046773) | Cod sursa (job #3356458)
#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;
}