用矩阵乘法求斐波那契数列。
应该算水题吧,纯粹用来联系矩阵快速幂的。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std ;
typedef struct fib{
int f[5][5] ;
}fib ;
fib init_0() {
fib x ;
memset(x.f , 0 , sizeof(x.f)) ;
x.f[0][0] = 1 ;
x.f[0][1] = 0 ;
x.f[1][0] = 0 ;
x.f[1][1] = 1 ;
return x ;
}
fib init_1() {
fib x ;
memset(x.f , 0 , sizeof(x.f)) ;
x.f[0][0] = 1 ;
x.f[0][1] = 1 ;
x.f[1][0] = 1 ;
x.f[1][1] = 0 ;
return x ;
}
fib multi(fib x , fib y) {
fib ans ;
memset(ans.f , 0 , sizeof(ans.f)) ;
for (int i = 0 ; i <= 1 ; i ++) {
for (int j = 0 ; j <= 1 ; j ++) {
for (int k = 0 ; k <= 1 ; k ++) {
ans.f[i][j] += x.f[i][k] * y.f[k][j] ;
ans.f[i][j] %= 10000 ;
}
}
}
return ans ;
}
int pow(int n) {
fib x , ans ;
ans = init_0() ;
x = init_1() ;
while (n) {
if (n & 1) {
ans = multi(ans , x) ;
}
x = multi(x , x) ;
n >>= 1 ;
}
return ans.f[0][1] ;
}
int main() {
//freopen("in.txt" , "r" , stdin);
int n ;
while (cin >> n) {
if (n == -1) break ;
int ans ;
ans = pow(n) ;
cout << ans << endl ;
}
return 0 ;
}