Cod sursa(job #616744)

Utilizator popacamilpopa camil popacamil Data 13 octombrie 2011 11:27:18
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#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;
}