当前位置: 代码迷 >> 综合 >> POJ 3070 Fibonacci 矩阵快速幂 .
  详细解决方案

POJ 3070 Fibonacci 矩阵快速幂 .

热度:50   发布时间:2023-09-23 03:48:59.0

题目地址:http://poj.org/problem?id=3070

求后四位,还有求前四位的用公式

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cmath>
#include <sstream>
#include <vector>
using namespace std;
#define REP(i,a,b) for(int i=a;i<(int)b;i++)
#define REPD(i,a,b) for(int i=a;i>=(int)b;i--)
struct Matrix{  int a[2][2];  int r; // r*r   Matrix(int r):r(r){memset(a,0,sizeof(a));} //初始化长  void MakeI(int x){             //变为x*E的单位矩阵   memset(a,0,sizeof(a));  for(int i=0;i<r;i++) a[i][i]=x;  }  Matrix operator * (const Matrix& m) {  //矩阵乘法   Matrix result(r);  for(int i=0;i<r;i++)  for(int j=0;j<r;j++)  {  for(int k=0;k<r;k++)  result.a[i][j]+=a[i][k]*m.a[k][j];  }  return result;  }  Matrix operator % (const int p){ //矩阵对每个元素取余   Matrix result(*this);  for(int i=0;i<r;i++)  for(int j=0;j<r;j++)  result.a[i][j]%=p;  return result;  }  Matrix operator + (const Matrix& m){  //矩阵互相相加   Matrix result(r);  for(int i=0;i<r;i++)  for(int j=0;j<r;j++)  result.a[i][j]=a[i][j]+m.a[i][j];  return result;  }  Matrix operator + (int n){     //加上个常数   Matrix result(r);  result.MakeI(n);  return *this+result;  }  
};
Matrix PowMod(Matrix x,int n,int p)  //x^n 对Max取模 
{Matrix result(2);result.MakeI(1);Matrix base = x%p; while(n>0){if(n & 1)result=(result*base)%p; //当二进制不为0时,就要乘个 base=(base*base)%p;    //累乘此时二进制的权值 n>>=1;}return result;
}
int main()
{Matrix m(2);m.a[0][0]=1;m.a[0][1]=1;m.a[1][0]=1;m.a[1][1]=0;int n;while(scanf("%d",&n)==1&&n!=-1){if(n==0) printf("0\n");else {Matrix ans=PowMod(m,n,10000);printf("%d\n", ans.a[0][1]);}}return 0;
}