Pagini recente » Monitorul de evaluare | Istoria paginii runda/simulareidk/clasament | Cod sursa (job #943860) | Cod sursa (job #2008426) | Cod sursa (job #2917714)
#include <fstream>
#define MOD 666013
#define N 3
using namespace std;
ifstream cin("kfib.in");
ofstream cout("kfib.out");
long long mat[N][N];
long long matc[N][N];
long long mati[N][N];
void inmultire(long long mat[][N],long long matt[][N],long long matf[][N],long long n,long long m,long long p)
{
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
matf[i][j]=0;
for(long long i=1; i<=n; i++)
{
for(long long j=1; j<=m; j++)
{
for(long long l=1; l<=p; l++)
{
matf[i][j]+=mat[i][l]*matt[l][j];
matf[i][j]%=MOD;
}
}
}
}
void atribuire(long long mat1[][N],long long mat2[][N],long long n,long long m)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
mat1[i][j]=mat2[i][j];
}
}
}
int main()
{
mati[1][1]=1;
mati[1][2]=1;
mati[2][1]=1;
mati[2][2]=0;
///
mat[1][1]=1;
mat[1][2]=1;
mat[2][1]=1;
mat[2][2]=0;
long long n;
cin>>n;
n--;
while(n>0)
{
if(n%2==1)
{
inmultire(mati,mat,matc,2,2,2);
atribuire(mati,matc,2,2);
n--;
}
else
{
inmultire(mat,mat,matc,2,2,2);
atribuire(mat,matc,2,2);
n/=2;
}
}
cout<<mati[2][1]%MOD;
return 0;
}