Pagini recente » Cod sursa (job #1853641) | Diferente pentru implica-te/arhiva-educationala intre reviziile 75 si 76 | Cod sursa (job #2188429) | Cod sursa (job #1382949) | Cod sursa (job #616744)
Cod sursa(job #616744)
#include<cstdio>
using namespace std;
long long int n,v[2],m[2][2],a[2][2],m3[2][2],c,c2;
void mm(long long int m1[][2], long long int m2[][2]){
m3[1][1]=(m1[1][1]*m2[1][1]+m1[1][2]*m2[2][1])%666013;
m3[1][2]=(m1[1][1]*m2[1][2]+m1[1][2]*m2[2][2])%666013;
m3[2][1]=(m1[2][1]*m2[1][1]+m1[2][2]*m2[2][1])%666013;
m3[2][2]=(m1[2][1]*m2[1][2]+m1[2][2]*m2[2][2])%666013;
}
void multiply(){
for(int i=1;i<=2;++i){
for(int j=1;j<=2;++j){
a[i][j]=m[i][j];
}
}
for(int i=0;(1<<i)<=n;++i){
if(1<<i & n){
mm(a,m);
for(int j=1;j<=2;++j){
for(int k=1;k<=2;++k){
m[j][k]=m3[j][k];
}
}
}
mm(a,a);
for(int j=1;j<=2;++j){
for(int k=1;k<=2;++k){
a[j][k]=m3[j][k];
}
}
}
}
int main(){
freopen("kfib.in","r",stdin);
freopen("kfib.out","w",stdout);
scanf("%d",&n);
n-=1;
m[1][1]=0;
m[1][2]=1;
m[2][1]=1;
m[2][2]=1;
multiply();
v[1]=0;
v[2]=1;
c=((v[1]*m[1][1])%666013+(v[2]*m[2][1])%666013)%666013;
c2=((v[1]*m[1][2])%666013+(v[2]*m[2][2])%666013)%666013;
printf("%lld",c);
return 0;
}