HDU 4549 M斐波那契数列(构造矩阵)
2016-03-19 10:52
459 查看
题目链接:
HDU 4549 M斐波那契数列
HDU 4549 M斐波那契数列
/* * 分析: * 将每个数用a[0]和a[1]表示,发现a[0]和a[1]的幂的变化符合Fibonacci数列。 * 所以可以用矩阵快速幂求出相应的幂数,然后再用整数快速幂求出a[0]和a[1]的幂 * 再把结果相乘%(1e9+7)即是结果。 * 注意: * 对于(A^B)%C,如果C是素数,且A和C互质(只有一个公因子1) * 则等价于(A^(B%(C-1)))%C */ //1612K 0MS #include <cstdio> #include <cstring> #include <cmath> #include <climits> #include <algorithm> #include <iostream> using namespace std; const long long mod=(long long)(1e9+7); struct Matrix{ int row,col; long long data[10][10]; }; void Init(Matrix& x,int row,int col) { x.row=row; x.col=col; memset(x.data,0,sizeof(x.data)); } Matrix Multiply(Matrix a,Matrix b) { Matrix ans; Init(ans,a.row,b.col); for(int i=1;i<=ans.row;i++){ for(int j=1;j<=ans.col;j++){ for(int k=1;k<=a.col;k++){ ans.data[i][j]+=a.data[i][k]*b.data[k][j]; ans.data[i][j]%=(mod-1); //对于(A^B)%C,如果C是素数,且A和C互质(只有一个公因子1), //则等价于(A^(B%(C-1)))%C } } } return ans; } void Unit(Matrix& x) { for(int i=1;i<=x.row;i++) x.data[i][i]=1; } Matrix quick_power(Matrix a,long long n) { Matrix ans,tmp=a; Init(ans,a.row,a.col); Unit(ans); while(n){ if(n&1) ans=Multiply(ans,tmp); tmp=Multiply(tmp,tmp); n>>=1; } return ans; } long long solve(long long a,long long n) { long long ans=1,tmp=a; while(n){ if(n&1) ans=ans*tmp%mod; tmp=tmp*tmp%mod; n>>=1; } return ans%mod; } int main() { //freopen("Rin.txt","r",stdin); //freopen("Rout.txt","w",stdout); /* for(int i=0;i<=100;i++) printf("1 2 %d\n",i); */ long long a,b,n; while(cin>>a>>b>>n){ a=a%mod,b=b%mod; if(n==0){ cout<<a<<endl; continue; }else if(n==1){ cout<<b<<endl; continue; } if(a==0||b==0){ printf("0\n"); continue; } else if(a==1&&b==1){ printf("1\n"); continue; } Matrix tmp,ans; tmp.row=tmp.col=2; tmp.data[1][1]=0; tmp.data[1][2]=tmp.data[2][1]=tmp.data[2][2]=1; ans=quick_power(tmp,n-1); long long na=ans.data[1][2]%(mod-1); long long nb=ans.data[2][2]%(mod-1); //printf("a=%I64d b=%I64d na=%I64d nb=%I64d\n",a,b,na,nb); a=solve(a,na); b=solve(b,nb); //printf("a=%I64d b=%I64d\n",a,b); printf("%I64d\n",a*b%mod); } }
相关文章推荐
- C#实现矩阵乘法实例分析
- C#中矩阵运算方法实例分析
- C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法
- C#计算矩阵的秩实例分析
- C#实现矩阵转置的方法
- C#检测两个矩阵是否相等的方法
- JS实现简单的二维矩阵乘积运算
- Javascript图像处理―为矩阵添加常用方法
- 利用C++实现矩阵的相加/相称/转置/求鞍点
- python实现矩阵乘法的方法
- C#判断一个矩阵是否为对称矩阵及反称矩阵的方法
- C#计算矩阵的逆矩阵方法实例分析
- C++实现矩阵原地转置算法
- C#实现矩阵加法、取负、数乘、乘法的方法
- java实现任意矩阵Strassen算法
- 从零开始学习OpenGL ES之七 – 变换和矩阵
- 矩阵乘法 c实现
- 程序员能力矩阵翻译
- 初学数模-MATLAB Quick Start! Part II
- 查找一个list中各个数组的元素在一个固定数组中的位置, 并把位置信息记录到一个矩阵里