题目链接:http://poj.org/problem?id=3070
题意:输出副对角线上的值
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int mod=10000;
struct matrix{
int x[2][2];
};
matrix mul(matrix a,matrix b){
matrix temp;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
temp.x[i][j]=0;
for(int k=0;k<2;k++){
temp.x[i][j]=(temp.x[i][j]+a.x[i][k]*b.x[k][j]%mod)%mod;
}
}
}
return temp;
}
matrix pow(matrix a,int k){
matrix ans;
memset(ans.x,0,sizeof(ans.x));
for(int i=0;i<2;i++)
ans.x[i][i]=1;
while(k){
if(k&1) ans=mul(ans,a);
a=mul(a,a);
k=k>>1;
}
return ans;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF&&n!=-1){
matrix xx;
xx.x[0][0]=1;
xx.x[0][1]=1;
xx.x[1][0]=1;
xx.x[1][1]=0;
matrix mat=pow(xx,n);
//cout<<mat.x[0][0]<<" "<<mat.x[0][1]<<endl<<mat.x[1][0]<<" "<<mat.x[1][1]<<endl;
printf("%d\n",mat.x[0][1]=0?0:mat.x[0][1]);
}
return 0;
}