经典的用矩阵解决的题目.
f(k)表示数列的第k项,那么可以很容易的得到
f(n) 1 1 f(1)
= 的n-1次方 *
f(n-1) 1 0 f(0)
-______________________-不会打符号郁闷
矩阵求次方就是二分的范畴了....
要保留4位就是对10000求模
具体见代码
- #include <iostream>
- using namespace std;
- struct Mat
- {
- int mat[2][2];
- Mat operator*(const Mat& mat_b)
- {
- Mat tmp;
- int i,j,k;
- for(i=0;i<2;i++)for(j=0;j<2;j++)tmp.mat[i][j]=0;
- for(i=0;i<2;i++)for(j=0;j<2;j++)for(k=0;k<2;k++)
- {
- tmp.mat[i][j]+=mat[i][k]*mat_b.mat[k][j];
- if(tmp.mat[i][j]>=10000) tmp.mat[i][j]%=10000;
- }
- return tmp;
- }
- Mat pow(int k)
- {
- if(k==1) return (*this);
- Mat tmp=(*this)*(*this);
- if(k&1)
- return tmp.pow(k/2)*(*this);
- else
- return tmp.pow(k/2);
- }
- }A;
- int main()
- {
- int n;
- Mat tmp;
- A.mat[0][0]=A.mat[0][1]=A.mat[1][0]=1;A.mat[1][1]=0;
- while(cin>>n,n+1)
- {
- if(!n)
- {cout<<0<<endl;continue;}
- tmp=A;
- tmp=tmp.pow(n-1);
- cout<<tmp.mat[0][0]%10000<<endl;
- }
- return 0;
- }