Pagini recente » Cod sursa (job #1520773) | Cod sursa (job #1572524) | Cod sursa (job #2286732) | Cod sursa (job #1929018) | Cod sursa (job #2186920)
#include <iostream>
#include <fstream>
#define MOD 666013
using namespace std;
int fib(int n);
void putere(int f[2][2], int n);
void inmultire(int f[2][2], int m[2][2]);
int fib(int n)
{
/*
1 1
1 0
*/
int f[2][2] = {{1, 1},{1, 0}};
if(n == 0)
return 0;
putere(f, n - 1);
return f[0][0] % MOD;
}
void putere(int f[2][2], int n)
{
if(n == 0 || n == 1)
return;
int m[2][2] = {{1, 1},{1, 0}};
putere(f, n / 2);
inmultire(f, f);
if(n % 2)
inmultire(f, m);
}
void inmultire(int f[2][2], int m[2][2])
{
int a = (1LL * f[0][0] * m[0][0]) % MOD + (1LL * f[0][1] * m[1][0]) % MOD;
int b = (1LL * f[0][0] * m[0][1]) % MOD + (1LL * f[0][1] * m[1][1]) % MOD;
int c = (1LL * f[1][0] * m[0][0]) % MOD + (1LL * f[1][1] * m[1][0]) % MOD;
int d = (1LL * f[1][0] * m[0][1]) % MOD + (1LL * f[1][1] * m[1][1]) % MOD;
f[0][0] = a % MOD;
f[0][1] = b % MOD;
f[1][0] = c % MOD;
f[1][1] = d % MOD;
}
int main()
{
int n;
ifstream f("kfib.in");
ofstream g("kfib.out");
f >> n;
g << fib(n);
f.close();
g.close();
}