题目描述: 如何求取f(n),类似于斐波那契数列,用矩阵的快速二分幂原理进行
算法代码
#include <iostream> #include <cstdio> using namespace std; typedef struct m { int a[2][2]; }Mat; typedef struct o { int sno; //器官序号 int day; }Cat; Cat cat[N]; // const int N=10001; const __int64 INF = 10e18; Mat E;//unit matrix; void InitE(Mat& e) { e.a[0][0]=1; e.a[0][1]=0; e.a[1][0]=0; e.a[1][1]=1; } Mat MatMul(Mat x,Mat y) { int i,j,k; Mat c; for(i=0;i<2;++i) for(j=0;j<2;++j) { c.a[i][j]=0; for(k=0;k<2;++k) { c.a[i][j]+=x.a[i][k] * y.a[k][j]; } c.a[i][j] %=7; } return c; } Mat MatPow(Mat d,int n) //matrix binary divide,calculate n power of matrix a { Mat t=E; while(n>0) { if(n&1) t=MatMul(t,d); d = MatMul(d,d); n>>=1; } return t; } int main() { int p,q,n; while(cin>>p>>q>>n && p|q|n) { if(!n) cout<<q<<endl; else if(n<3) cout<<p<<endl; else { InitE(E); //init unit matrix Mat m; m.a[0][0] = p; m.a[0][1] = q; m.a[1][0] = 1; m.a[1][1] = 0; m = MatPow(m,n-2); cout<<(m.a[0][0]+m.a[0][1])%7<<endl; } } return 0; }