HDU 4549 M斐波那契数列(矩阵快速幂费马小定理)
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斐波那契数列(矩阵快速幂费马小定理)相关推荐
- HDU4549 M斐波那契数列(矩阵快速幂+费马小定理)
Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) ...
- 斐波那契数列矩阵快速幂
题意 用矩阵乘法求fibonacci数列的第n项. Solution 矩乘入门题啊,题目把题解已经说的很清楚里= =. 矩乘其实很简单,通过自己YY或者是搜索对于一个递推公式求出它所对应的矩阵,然后套 ...
- HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)
题目链接:点击查看 题目大意:给出函数f(x): 现给出n,a,b,c,mod,求f(n)对mod取模后的结果 题目分析:这个题目相对于前几个题来说稍微加大了点难度,但还是挺水的一个题,首先我们可以对 ...
- hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)
M斐波那契数列 Time Limit: 3000/1 ...
- hdu 4549 M斐波那契数列(矩阵乘法+降幂公式)
Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) ...
- 奶牛家族(斐波那契数列的快速幂乘矩阵算法)
TX面试题: 已知有一头牛4年后开始生小牛,一次只能生一只,问20年后一共有多少头牛? 这种问题就是简单的递归: 这头奶牛在第四年后能不断生子直到第二十年,其子出生4年后又能不断生子-- 代码如下: ...
- YBTOJ:斐波拉契(矩阵快速幂)
文章目录 题目描述 题目描述 代码 题目描述 题目描述 关键在于如何转化为本题的题目... 设 y=(1-根号5)/2$$ 再令: A(n)=xn +++ yn 通过尝试可以发现,A其实就是一个1,3 ...
- 牛客15666 又见斐波那契(矩阵快速幂)
链接:https://ac.nowcoder.com/acm/problem/15666 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 蓝桥杯历届试题----斐波那契(矩阵快速幂)
问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 -. (x=1,2) f(x) = f(x-1) + f(x-2) -. (x>2) 对于给定的整数 n 和 m,我们希望求 ...
最新文章
- 选什么专业,最容易拿下互联网大厂 Offer?三个支付宝新人来支招
- 16位cpu 移位处理
- Uptime Tier Ⅳ标准数据中心的柴发油路设计关键点
- 当AR落地B端行业应用,它的无限可能在哪?
- iOS LLDB调试精解
- 你对jstl了解多少----JSTL标签之函数(慎用)
- sql 跨数据库 连表
- so没有打包进AKP导致java.lang.UnsatisfiedLinkError: dlopen failed: library “lib.so“ not found
- imb服务器怎么拆硬盘,IBM P750更换本地硬盘
- 微信接口API之长链接转短链接代码示例
- OutLook 2013 添加 USC gmail 邮箱 解决国内USC邮箱打不开
- java closed_Java开发网 - ZipFile closed是什么错误?
- 用Python做市场调查:餐饮商铺的用户满意度分析
- C++刷题的一些小tips
- 计算机控制系统课程设计交通灯,太原理工大学数字逻辑课设(交通灯)
- 苹果Mac电脑清理垃圾软件卸载工具CleanMyMac X
- 微信小程序 | 一比一复刻世界杯点球大战
- openlayers
- 使用canvas截图跨域导致的报错(Failed to execute ‘toDataURL‘ on ‘HTMLCanvasElement)
- 智慧商场精准客流统计系统
热门文章
- Sybase APL 与 DOL 表
- java gbc_java面试题good and gbc
- 网络调试 adb tcpip 开启方法
- 学计算机的今年去当兵 转士官难吗,青年当兵学技术后,转士官到底难不难?这个答案要周知...
- Validform表单验证框架详解
- table中加表单元素每行怎么验证_Validform 一行代码搞定整站的表单验证 - 文章
- 使用腾讯地图驾车规划路线
- 修改QQ执行顺序,获取QQ2008最新版密
- 人工智能,百度AI人脸识别java版
- Ctrl Shift 按键被搜狗占用之封杀搜狗快捷方式