Pagini recente » Cod sursa (job #2189480) | Cod sursa (job #2138469) | Cod sursa (job #1204094) | Cod sursa (job #571513) | Cod sursa (job #917136)
Cod sursa(job #917136)
#include <cstdio>
#include <cstring>
#define mod 666013
FILE *f=fopen("kfib.in","r");
FILE *g=fopen("kfib.out","w");
using namespace std;
long long n,m,t1,t2,t3,m3[2][2],m4[2][2];
long long mult1(long long m1[2][2],long long m2[2][2])
{
int i,j,k;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
for(k=0;k<2;k++)
m3[i][j]=(m3[i][j]+m1[i][k]*m2[k][j])%mod;
}
long long mult2(long long m1[2][2],long long m2[2][2])
{
int i,j,k;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
for(k=0;k<2;k++)
m4[i][j]=(m4[i][j]+m1[i][k]*m2[k][j])%mod;
}
long long cmmdc(long long a,long long b)
{
long long r;
while(b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
long long fibo(long long x)
{
long long m1[2][2],m0[2][2];
m1[0][0]=m1[0][1]=m1[1][0]=1;m1[1][1]=0;
m0[0][0]=m0[0][1]=m0[1][0]=1;m0[1][1]=0;
if(x==0)return 0;
if(x==1)return 1;
while(x>1)
{
if(x%2==0)
{
mult1(m1,m1);
memcpy(m1,m3,sizeof(m3));
memset(m3,0,sizeof(m3));
x/=2;
}
else
if(x%2==1)
{
mult2(m1,m0);
memcpy(m0,m4,sizeof(m4));
memset(m4,0,sizeof(m4));
x--;
}
}
mult1(m1,m0);
memcpy(m1,m3,sizeof(m3));
return m1[1][1];
}
int main()
{
long long x;
fscanf(f,"%lld",&x);
fprintf(g,"%lld",fibo(x));
return 0;
}