hdu-4549 M斐波那契数列【矩阵快速幂】
2016-04-19 12:01
260 查看
找规律写出f(2),f(3),f(4),f(5) .........可以发先 a b的系数是一系列的fib数列 如果可以求出fib数列 求快速幂就可以了 这样问题就在于如何求fib数列了
1 1
【f[n-1],f[n-2]】 * 1 0 = 【f
,f[n-1]】
当gcd(A,M)==1的时候
A^X = A^( X mod Eular(M) ) ( mod M ) .
1 1
【f[n-1],f[n-2]】 * 1 0 = 【f
,f[n-1]】
当gcd(A,M)==1的时候
A^X = A^( X mod Eular(M) ) ( mod M ) .
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <vector> #define L 2 using namespace std; typedef long long int llint; typedef vector<llint> vec; typedef vector<vec> mat; const llint MOD=1000000007; struct Matrix { llint m[L][L]; }; Matrix matrix_mul(Matrix a,Matrix b) { Matrix res; for(int i=0;i<L;++i) for(int j=0;j<L;++j) { res.m[i][j]=0; for(int k=0;k<L;++k) { res.m[i][j]+=a.m[i][k]*b.m[k][j]; res.m[i][j]%=MOD-1; } } return res; } Matrix Mquickpow(Matrix p,llint n) { Matrix res; res.m[0][0]=res.m[1][1]=1; res.m[0][1]=res.m[1][0]=0; while(n>0) { if(n&1) res=matrix_mul(p,res); n=n>>1; p=matrix_mul(p,p); } return res; } llint quickpow(llint a,llint n) { llint res=1; a%=MOD; while(n>0) { if(n&1) res=res*a%MOD; n=n>>1; a=a*a%MOD; } return res; } int main() { llint a,b,n; Matrix t; t.m[0][0]=0,t.m[0][1]=t.m[1][0]=t.m[1][1]=1; while(~scanf("%lld%lld%lld",&a,&b,&n)) { if(n==0) printf("%lld\n",a%MOD); else if(n==1) printf("%lld\n",b%MOD); else { Matrix res=Mquickpow(t,n-2); llint f0=(res.m[0][0]+res.m[0][1])%(MOD-1); llint f1=(res.m[1][0]+res.m[1][1])%(MOD-1); llint ans=(quickpow(a,f0)%MOD)*(quickpow(b,f1)%MOD); ans%=MOD; printf("%lld\n",ans); } } return 0; }
相关文章推荐
- 多线程并发编程(一):传统多线程实现方式
- ZOJ 2404 Going Home 【最小费用最大流】
- 结对编程总结
- strstr()
- es6 for of
- redis客户端hiredis详解
- SpringMVC处理静态资源
- 检测用户拖动ScrollView速度
- 初步实现最长回文子串
- 地图的集成
- android.content.res.Resources$NotFoundException
- 数组-冒泡排序
- 五月份--到处溜达
- Response.Redirect(),Server.Transfer(),Server.Execute()的区别
- SurfaceView取景拍照
- 计算机图形学(二)输出图元_5_帧缓存值的装载
- Tomcat、MySQL注意
- C#中方法参数的类型
- 纪念
- Ubuntu下安装mysql5.6