M斐波那契数列

                                                                          Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)

Problem Description
M斐波那契数列F[n]是一种整数数列,它的定义如下:

F[0] = a
F[1] = b
F[n] = F[n-1] * F[n-2] ( n > 1 )

现在给出a, b, n,你能求出F[n]的值吗?

Input
输入包含多组测试数据;
每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 )
Output
对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行。
Sample Input
0 1 0 6 10 2
Sample Output
0 60
分析:用普通方法提交了一次,果断超时。
写出F(2)、F(3)、F(4)、F(5)…会发现a和b的指数是fib数,如果求出fib数列,用快速幂就可以快速求出最后答案。问题转化为了如何快速求解fib数列。
因为【F(n-2),F(n-1)】*【0,1,1,1】 = 【F(n-1),F(n)】,所以可以用矩阵乘法来求。
每次相乘的矩阵为 
0    1
1    1        
为了防止求F(n)时溢出,要对矩阵元素取模,即 a[i][j]  %= 1000000006。模数之所以为1000000006是因为根据费马小定理可得A^euler(M) = 1 (mod M),其中M为素数。
所以A^N = A^(N % euler(M))(mod M),而1000000007为素数,euler(1000000007)= 1000000006,所以模数是1000000006。
求出F(n-1)和F(n)以后,用二分快速幂求出pow(a,F(n-1))* pow(b,F(n))% 1000000007 就是最后的答案。
#include<stdio.h>
#define mod 1000000007
typedef __int64 LL;
struct Matrix
{LL mat[2][2];
};Matrix unit_matrix =
{1, 0,0, 1
}; //单位矩阵Matrix mul(Matrix a, Matrix b) //矩阵相乘
{Matrix res;for(int i = 0; i < 2; i++)for(int j = 0; j < 2; j++){res.mat[i][j] = 0;for(int k = 0; k < 2; k++){res.mat[i][j] += a.mat[i][k] * b.mat[k][j];res.mat[i][j] %= 1000000006;}}return res;
}Matrix pow_matrix(Matrix a, LL n)  //矩阵快速幂
{Matrix res = unit_matrix;while(n != 0){if(n & 1)res = mul(res, a);a = mul(a, a);n >>= 1;}return res;
}LL pow(LL a, LL n) //二分快速幂
{a %= mod;LL res = 1;while(n != 0){if(n & 1)res = res * a % mod;a = a * a % mod;n >>= 1;}return res;
}int main()
{LL a, b, n;Matrix tmp;tmp.mat[0][0] = 0;tmp.mat[0][1] = tmp.mat[1][0] = tmp.mat[1][1] = 1;while(~scanf("%I64d%I64d%I64d",&a,&b,&n)){Matrix p = pow_matrix(tmp, n); //p.mat[0][0]即为F(n-1),p.mat[1][0]即为F(n)LL ans = (pow(a, p.mat[0][0]) * pow(b, p.mat[1][0])) % mod;printf("%I64d\n",ans);}return 0;
}

hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)相关推荐

  1. HDU4549 M斐波那契数列 —— 斐波那契、费马小定理、矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-4549 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Li ...

  2. hdu 4549 M斐波那契数列(矩阵乘法+降幂公式)

    Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) ...

  3. HDU 4549 M斐波那契数列(矩阵快速幂费马小定理)

    ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 T ...

  4. HDU 4549 M斐波那契数列

    数论:当gcd(x,m)=1时,x^(m-1) mod m=1, #include <iostream> #include <cstdio> #include <algo ...

  5. ZYH的斐波那契数列【线段树动态开点+矩阵快速幂求斐波那契】

    描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...

  6. python斐波那契数列前20项_Python初学者笔记:打印出斐波那契数列的前10项

    问题:斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.- ...

  7. 求斐波那契数列的第n项

    提要 本文介绍了4种(3种?)求斐波那契数列第n项的方法. 斐波那契数列简介 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda ...

  8. 奶牛家族(斐波那契数列的快速幂乘矩阵算法)

    TX面试题: 已知有一头牛4年后开始生小牛,一次只能生一只,问20年后一共有多少头牛? 这种问题就是简单的递归: 这头奶牛在第四年后能不断生子直到第二十年,其子出生4年后又能不断生子-- 代码如下: ...

  9. c语言斐波那契数列前20项和,,c语言利用数组求斐波那契数列的前20项

    推荐回答 一.斐波那契数列指的是这样一个数列1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711 ...

最新文章

  1. java gc种类_Java GC系列(3):垃圾回收器种类
  2. mysql范围条件_MySQL 索引及优化实战(一)
  3. java配置pom安装依赖包,Maven pom.xml 添加本地jar包依赖以及打包方法
  4. python标准库time_Python3标准库:time时钟时间
  5. 实现ISA Server 2006物理机到VMware ESX 4虚拟机的迁移
  6. 在龙芯上调试CoreCLR
  7. 玩转短视频?守护视频安全?AI智能提速?一分钱体验? 阿里云视频点播大招盘点...
  8. TKDE2022 | 最新深度学习推荐系统综述:从协同过滤到信息增强的推荐系统
  9. gradle打包web jar_Gradle构建SpringBoot并打包可运行的jar配置
  10. 新疆有没有教电脑编程C语言,新疆学习电脑编程,新疆学电脑编程哪里好,新疆学电脑编程效果怎么样...
  11. Mac电脑问题:磁盘读写NTFS怎么不行?
  12. 数据分析师系列课程 统计学基础1
  13. Java的发展 Java在不同系统下的开发环境 Java语言特性 Java实现跨平台
  14. 斐讯k2虚拟服务器设置,斐讯K2调配设置
  15. JDBC 和数据库连接池
  16. 基于rhcs套件实现的高可用集群
  17. 计算机桌面下方标图,电脑下方怎么设置显示桌面图标
  18. linux基础:shell中的sh与bash区别与常用命令
  19. 电钻、电锤、电镐的区别
  20. java supper关键字

热门文章

  1. MpVue开发之swiper的使用
  2. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁
  3. golang常用手册:数组、变量作用域、函数
  4. Django Book 2.0 笔记——会话、用户和注册
  5. hdu 2441(ACM(Array Complicated Manipulation))
  6. 被程序员忽视的位运算
  7. How to become an expert in the IP industry? Here is where you should start
  8. JVM技术周报第2期
  9. 干货 | 蚂蚁金服是如何实现经典服务化架构往 Service Mesh 方向的演进的?
  10. linux常用命令 运算命令