M斐波那契数列(hdu4549矩阵二分幂+二分快速幂)
来源:互联网 发布:mac 虚拟机 qq游戏 编辑:程序博客网 时间:2024/05/30 07:12
题意:M斐波那契数列F[n]是一种整数数列,它的定义如下:
F[0] = a
F[1] = b
F[n] = F[n-1] * F[n-2] ( n > 1 )
F[0] = a
F[1] = b
F[n] = F[n-1] * F[n-2] ( n > 1 )
现在给出a, b, n,你能求出F[n]的值吗?
思路:首先化简方程式,一般的矩阵处理的都是形如f[n] = f[n-1] + f[n-2]的式子,根据F[n] = F[n-1] * F[n-2],F[n-1] = F[n-2] * F[n-3]。带入化简最后得到
f[n] = f[1] ^F[n] * f[0] ^ F[n-1];
f[1] ^F[n] ,f[0] ^ F[n-1] 可以用二分快速幂求,
F[n]代表第n个数的斐波那契数列可用矩阵二分幂求
本题还用到了一个数论 :
A^B %C 这题的C是质素,而且A,C是互质的。
所以直接A^(B%(C-1)) %C
#include<iostream>#include<cstdio>#include<cstring>using namespace std;struct Matrix{ long long row[2][2];};Matrix A,C,unit;const int MOD = 1000000007;void init(){ unit.row[0][0] = 1;unit.row[0][1] = 0; unit.row[1][0] = 0;unit.row[1][1] = 1; A.row[0][0] = 1;A.row[0][1] = 1; A.row[1][0] = 1;A.row[1][1] = 0; memset(C.row,0,sizeof(C.row)); C.row[0][0] = 1; C.row[1][0] = 1;}Matrix Matrix_mul(Matrix a,Matrix b){ Matrix sum ; memset(sum.row,0,sizeof(sum.row)); int i,j,k; for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { for(k = 0; k < 2; k++) { sum.row[i][j] += (a.row[i][k]*b.row[k][j]) % (MOD-1); } } } return sum;}Matrix quck_M(Matrix a,int n){ Matrix B = unit; while(n) { if(n&1) B = Matrix_mul(a,B); a = Matrix_mul(a,a); n = n >> 1; } return B;}long long quck_m(long long a,long long m){ long long rec = 1; a = a % MOD; while(m) { if(m&1) rec = (rec%MOD) * (a % MOD)%MOD; a = (a%MOD)*(a %MOD); m = m >> 1; } return rec;}int main(){ int a,b,n; while(scanf("%d%d%d",&a,&b,&n)!= EOF) { init(); if(n == 0) { printf("%d\n",a); continue; } else if(n == 1) { printf("%d\n",b);continue; } else if(n == 2) { printf("%d\n",a*b%MOD);continue; } Matrix B = quck_M(A,n-2); B = Matrix_mul(B,C); long long aa = B.row[0][0]; long long bb = B.row[1][0]; long long count = (quck_m(a,bb)%MOD)*(quck_m(b,aa) % MOD) % MOD; printf("%lld\n",count); } return 0;}
- M斐波那契数列(hdu4549矩阵二分幂+二分快速幂)
- hdu4549 M斐波那契数列(矩阵快速幂)
- HDU4549 M斐波那契数列【矩阵快速幂】
- hdu4549——M斐波那契数列(费马小定理+矩阵快速幂)
- hdu4549 M斐波那契数列 (矩阵快速幂+费马小定理)
- hdu4549 M斐波那契数列 【矩阵快速幂+快速幂+欧拉函数降次】
- hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)
- 解题报告:HDU4549 M斐波那契数列 数论三大基础(快速幂+矩阵快速幂+费马小定理)
- HDU4549 M斐波那契数列
- hdu4549 M斐波那契数列
- HDU4549M-斐波那契数列(矩阵快速幂,二分幂)
- hdu4549---M斐波那契数列(矩阵+欧拉定理)
- nyoj1000&&hdu4549 M斐波那契数列 递推公式+矩阵
- 【矩阵快速幂】HDU 4549 : M斐波那契数列(矩阵嵌套)
- 【费马小定理降幂+矩阵快速幂+快速幂】M斐波那契数列 HDU
- hdoj 4549 M斐波那契数列 【矩阵快速幂 + 费马小定理 + 快速幂】
- HDU 4549 M斐波那契数列(矩阵快速幂+快速幂+欧拉降幂)
- HDU 4549 M斐波那契数列(费马小定理,矩阵快速幂,快速幂)
- Intent和PendingIntent的使用和区别
- 使用foreach 遍历,快捷的清除Combox中的文字
- 往sdcard中写入数据
- Linux 用户管理工具介绍
- Oracle10g(10.2)数据库及其文档的下载
- M斐波那契数列(hdu4549矩阵二分幂+二分快速幂)
- 【Linux基础】Linux版本
- 英特尔大数据技术与分布式架构设计详解
- cobol文件操作
- 谈 Linux,Windows 和 Mac -王银纠正对linux的看法
- 世界上最漂亮的硬币、人民币呢?
- 做update的时候 用到的movefileex
- 73种网页常用js代码
- 关于unicode和多字节之间的关系及区别(笔记)