Pagini recente » Cod sursa (job #848429) | Cod sursa (job #2174358) | Cod sursa (job #1222027) | Cod sursa (job #1088532) | Cod sursa (job #2330339)
#include <bits/stdc++.h>
#define MOD 666013 // dat
using namespace std;
ifstream fin( "kfib.in" );
ofstream fout( "kfib.out" );
int N;
int mat[3][3], aux[3][3], init[3][3];
void Quick_exp( int pow )
//exponentiala , pentru al k lea termen face matricea
//0 1 la puterea n-2 * n citit
//1 1
// in aux pastreaza de la alt pas gen a^3=a^2*a
{
if( pow <= 1 ) return;
Quick_exp( pow / 2 ); //ajunge la 1 si face RECURSIV
for( int i = 1; i <= 2; ++i )
for( int j = 1; j <= 2; ++j )
{
aux[i][j] = 0;
for( int J = 1, I = 1; J <= 2; ++J, ++I )
aux[i][j] += ( 1LL * mat[i][J] * mat[I][j] ) % MOD;
aux[i][j] %= MOD;
}
if( pow % 2 )
{
for( int i = 1; i <= 2; ++i )
for( int j = 1; j <= 2; ++j )
mat[i][j] = aux[i][j];
for( int i = 1; i <= 2; ++i )
for( int j = 1; j <= 2; ++j )
{
aux[i][j] = 0;
for( int J = 1, I = 1; J <= 2; ++J, ++I )
aux[i][j] += ( 1LL * mat[i][J] * init[I][j] ) % MOD;
aux[i][j] %= MOD;
}
}
for( int i = 1; i <= 2; ++i )
for( int j = 1; j <= 2; ++j )
mat[i][j] = aux[i][j];
}
int main()
{
fin >> N;
//initializare matricea aia cu care se inm ( vezi indicatii arhiva)
init[1][2] = 1;
init[2][1] = 1;
init[2][2] = 1;
for( int i = 1; i <= 2; ++i )
for( int j = 1; j <= 2; ++j )
mat[i][j] = init[i][j];
Quick_exp( N - 2 );
fout << ( 1LL * mat[1][2] + mat[2][2] ) % MOD << '\n';
fout.close();
return 0;
}