Pagini recente » Cod sursa (job #443054) | Istoria paginii runda/concurs_aaa/clasament | Istoria paginii runda/tt | Cod sursa (job #2005758) | Cod sursa (job #1992313)
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
ifstream in("kfib.in");
ofstream out("kfib.out");
#define ll long long
#define pb push_back
const int inf = 1e9 + 5;
const int NMax = 3e6 + 5;
const int mod = 666013;
int K;
void prod(ll[2][2],ll[2][2]);
void pw(ll[2][2],int);
int main() {
/*
int a[2][2] = {1,2,3,4};
for (int i=0;i<2;++i) {
for (int j=0;j<2;++j) {
cout<<a[i][j]<<' ';
}
cout<<'\n';
}
test(a);
for (int i=0;i<2;++i) {
for (int j=0;j<2;++j) {
cout<<a[i][j]<<' ';
}
cout<<'\n';
}
*/
in>>K;
ll a[2][2] = {0,1,1,1};
ll b[2][2] = {0,0,1,0};
pw(a,K);
prod(a,b);
out<<a[0][0]<<'\n';
in.close();out.close();
return 0;
}
void prod(ll a[2][2],ll b[2][2]) {
ll ans[2][2] = {};
for (int i=0;i < 2;++i) {
for (int j=0;j < 2;++j) {
for (int k=0;k < 2;++k) {
ans[i][j] = (ans[i][j] + a[i][k] * b[k][j]) % mod;
}
}
}
for (int i=0;i < 2;++i) {
for (int j=0;j < 2;++j) {
a[i][j] = ans[i][j];
}
}
}
void pw(ll base[2][2],int exp) {
ll ans[2][2] = {1,0,0,1};
while (exp) {
if (exp & 1) {
prod(ans,base);
}
prod(base,base);
exp >>= 1;
}
for (int i=0;i < 2;++i) {
for (int j=0;j < 2;++j) {
base[i][j] = ans[i][j];
}
}
}