题目链接:http://poj.org/problem?id=3070
题目大意:求第n个斐波那契数(f[1]=0,f[2]=1,f[n]=f[n-1]+f[n-2])
题目思路:
{Fn,0,Fn-1,0}=({1,1,1,0})^n*{1,0,0,0},然后使用矩阵快速幂即可
以下是代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define MAXN 10005
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
#define MOD 10000
struct matrix{
int a[3][3];
}m,x,y;
matrix mul(matrix x,matrix y){
matrix ans;
rep(i,0,1){
rep(j,0,1){
ans.a[i][j]=0;
rep(k,0,1){
ans.a[i][j]=((ans.a[i][j]+x.a[i][k]*y.a[k][j]%MOD))%MOD;
}
}
}
return ans;
}
int main(){
int n;
while(~scanf("%d",&n)&&n!=-1){
m.a[0][0]=m.a[0][1]=m.a[1][0]=1,m.a[1][1]=0;
x.a[0][0]=x.a[1][1]=1;x.a[0][1]=x.a[1][0]=0;
y.a[0][0]=1;y.a[0][1]=y.a[1][0]=y.a[1][1]=0;
while(n){
if(n&1){
x=mul(x,m);
}
n>>=1;
m=mul(m,m);
}
y=mul(x,y);
printf("%d\n",y.a[1][0]);
}
return 0;
}