ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路。。。

题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

题意

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取模后的值即可,每组数据输出一行。

思路

一看到题,就拿二维01矩阵变来变去尝试半天,无果,就手推了几部,猛然发现f[i] = a^fib[i- 1]*b^fib[i]。道友们动动手,很容易就能发现。
然后就是刷刷的矩阵快速幂求fib,求出两数,再快速幂,结果得出,俩样例试过没问题,提交,wrong。。。
找来找去,找不出错误在哪,去百度了下,发现别人在对矩阵快速幂的时候都是对MOD-1取余的,顿时纳闷,才发现自己忽略了a^b时迭代时不能直接取余的。
看解释说是由费马小定理可以得出循环节是MOD-1,所以对MOD-1取余。仔细的看了费马小定理,似懂非懂的,至于循环节,压根就没想通,可怜在数论上几近一张白纸的我。(ps:过两天好好研究研究)

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <map>using namespace std;#define LL long longconst int MOD = 1000000007;struct Node
{LL a, b, c, d;Node(){};Node(LL a, LL b, LL c, LL d):a(a),b(b),c(c),d(d){}Node operator*(const Node& t){Node ans;ans.a = ((this->a*t.a)%(MOD-1)+(this->b*t.c)%(MOD-1))%(MOD-1);ans.b = ((this->a*t.b)%(MOD-1)+(this->b*t.d)%(MOD-1))%(MOD-1);ans.c = ((this->c*t.a)%(MOD-1)+(this->d*t.c)%(MOD-1))%(MOD-1);ans.d = ((this->c*t.b)%(MOD-1)+(this->d*t.d)%(MOD-1))%(MOD-1);return ans;}
};LL qpower(LL n, LL x)
{LL ans = 1;LL p = x;while(n){if(n & 1)ans = (ans*p)%MOD;p = (p*p)%MOD;n >>= 1;}return ans;
}int main()
{LL a, b, n;while(cin>>a>>b>>n){Node p = Node(0, 1, 1, 1);Node ans = Node(1, 0, 0, 1);if(n == 0){cout<<a<<endl;continue;}--n;while(n){if(n & 1)ans = ans*p;p = p*p;n >>= 1;}LL fiba = ans.b;LL fibb = ans.d;LL rel = 0;rel = (qpower(fiba, a) * qpower(fibb, b))%MOD;cout<<rel<<endl;}
}

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

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

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

  2. 斐波那契数列矩阵快速幂

    题意 用矩阵乘法求fibonacci数列的第n项. Solution 矩乘入门题啊,题目把题解已经说的很清楚里= =. 矩乘其实很简单,通过自己YY或者是搜索对于一个递推公式求出它所对应的矩阵,然后套 ...

  3. HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)

    题目链接:点击查看 题目大意:给出函数f(x): 现给出n,a,b,c,mod,求f(n)对mod取模后的结果 题目分析:这个题目相对于前几个题来说稍微加大了点难度,但还是挺水的一个题,首先我们可以对 ...

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

    M斐波那契数列                                                                           Time Limit: 3000/1 ...

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

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

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

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

  7. YBTOJ:斐波拉契(矩阵快速幂)

    文章目录 题目描述 题目描述 代码 题目描述 题目描述 关键在于如何转化为本题的题目... 设 y=(1-根号5)/2$$ 再令: A(n)=xn +++ yn 通过尝试可以发现,A其实就是一个1,3 ...

  8. 牛客15666 又见斐波那契(矩阵快速幂)

    链接:https://ac.nowcoder.com/acm/problem/15666 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  9. 蓝桥杯历届试题----斐波那契(矩阵快速幂)

    问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 -. (x=1,2) f(x) = f(x-1) + f(x-2) -. (x>2) 对于给定的整数 n 和 m,我们希望求 ...

最新文章

  1. 选什么专业,最容易拿下互联网大厂 Offer?三个支付宝新人来支招
  2. 16位cpu 移位处理
  3. Uptime Tier Ⅳ标准数据中心的柴发油路设计关键点
  4. 当AR落地B端行业应用,它的无限可能在哪?
  5. iOS LLDB调试精解
  6. 你对jstl了解多少----JSTL标签之函数(慎用)
  7. sql 跨数据库 连表
  8. so没有打包进AKP导致java.lang.UnsatisfiedLinkError: dlopen failed: library “lib.so“ not found
  9. imb服务器怎么拆硬盘,IBM P750更换本地硬盘
  10. 微信接口API之长链接转短链接代码示例
  11. OutLook 2013 添加 USC gmail 邮箱 解决国内USC邮箱打不开
  12. java closed_Java开发网 - ZipFile closed是什么错误?
  13. 用Python做市场调查:餐饮商铺的用户满意度分析
  14. C++刷题的一些小tips
  15. 计算机控制系统课程设计交通灯,太原理工大学数字逻辑课设(交通灯)
  16. 苹果Mac电脑清理垃圾软件卸载工具CleanMyMac X
  17. 微信小程序 | 一比一复刻世界杯点球大战
  18. openlayers
  19. 使用canvas截图跨域导致的报错(Failed to execute ‘toDataURL‘ on ‘HTMLCanvasElement)
  20. 智慧商场精准客流统计系统

热门文章

  1. Sybase APL 与 DOL 表
  2. java gbc_java面试题good and gbc
  3. 网络调试 adb tcpip 开启方法
  4. 学计算机的今年去当兵 转士官难吗,青年当兵学技术后,转士官到底难不难?这个答案要周知...
  5. Validform表单验证框架详解
  6. table中加表单元素每行怎么验证_Validform 一行代码搞定整站的表单验证 - 文章
  7. 使用腾讯地图驾车规划路线
  8. 修改QQ执行顺序,获取QQ2008最新版密
  9. 人工智能,百度AI人脸识别java版
  10. Ctrl Shift 按键被搜狗占用之封杀搜狗快捷方式