Mai intai trebuie sa te autentifici.
Cod sursa(job #1390702)
Utilizator | Data | 17 martie 2015 11:24:52 | |
---|---|---|---|
Problema | Al k-lea termen Fibonacci | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.26 kb |
#include<cstdio>
const int MOD=666013;
class Matrix{
public:
int a[3][3];
Matrix(){
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
a[i][j]=0;
a[1][2]=1;
a[2][1]=1;
a[2][2]=1;
}
Matrix(int x){
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
a[i][j]=0;
for(int i=1;i<=2;i++)
a[i][i]=x;
}
};
Matrix m;
int n;
Matrix matrix_prod(Matrix m1,Matrix m2){
Matrix r=Matrix(0);
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++){
int x=(long long)m1.a[i][k]*m2.a[k][j]%MOD;
r.a[i][j]=(r.a[i][j]+x)%MOD;
}
return r;
}
Matrix matrix_pow(int a){
if(a==0)
return Matrix(1);
if(a%2==0){
Matrix nr=matrix_pow(a/2);
return matrix_prod(nr,nr);
}
return matrix_prod(matrix_pow(a-1),m);
}
int main(){
freopen("kfib.in","r",stdin);
freopen("kfib.out","w",stdout);
scanf("%d",&n);
if(n<2){
printf("%d",n);
return 0;
}
Matrix res=matrix_pow(n-1);
printf("%d",res.a[2][2]);
return 0;
}