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
Source
2013金山西山居创意游戏程序挑战赛——初赛(2)
Recommend
liuyiding

让求F[n],公式里面是乘法,不好构造矩阵,但是发现乘法的幂次是相加的:

f0 = a;

f1 = b;

f2 = f0*f1;

f3 = f0 * (f1^2);

f4 = (f0^2) * (f1^3);

f5 = (f0^3) * (f1^5);

可以发现第i项的f0的幂次等于前两项f0幂次的和,f1的幂次同样也是。(其实就是斐波那契数列)

但是还有一个问题,a^(n%mod) != (a^n)%mod,这样我们就得用到降幂公式:

(a^n)%mod = (a^(n%(mod-1)))%mod;   (mod是质数)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;const int mod = 1000000006;struct Matrix
{long long m[2][2];int n;Matrix(int x){n = x;for(int i=0;i<n;i++)for(int j=0;j<n;j++)m[i][j] = 0;}Matrix(int _n,int a[2][2]){n = _n;for(int i=0;i<n;i++)for(int j=0;j<n;j++){m[i][j] = a[i][j];}}
};
Matrix operator *(Matrix a,Matrix b)
{int n = a.n;Matrix ans = Matrix(n);for(int i=0;i<n;i++)for(int j=0;j<n;j++)for(int k=0;k<n;k++){ans.m[i][j] += (a.m[i][k]%mod)*(b.m[k][j]%mod)%mod;ans.m[i][j] %= mod;}return ans;
}
Matrix operator ^(Matrix a,int k)
{int n = a.n;Matrix c(n);int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++)c.m[i][j] = (i==j);for(;k;k>>=1){if(k&1)c=c*a;a = a*a;}return c;
}LL quickpow(LL x,int k,int m)
{LL ans = 1;while(k){if(k&1)ans = ans*x%m;x = x*x%m;k /= 2;}return ans;
}
int main(void)
{int x,y,n,i,j;while(scanf("%d%d%d",&x,&y,&n)==3){int a[2][2] = { 0,1,1,1};Matrix A(2,a);int b[2][2] = { 1,0,0,1};Matrix B(2,b);A = A^n;A = A*B;int k1 = A.m[0][0];int k2 = A.m[0][1];LL ans = (quickpow(x,k1,mod+1)*quickpow(y,k2,mod+1))%(mod+1);cout << ans << endl;}return 0;
}

hdu 4549 M斐波那契数列(矩阵乘法+降幂公式)相关推荐

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

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

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

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

  3. HDU 4549 M斐波那契数列

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

  4. [ZJOI2011]细胞——斐波那契数列+矩阵加速+dp

    Description bzoj2323 Solution 题目看起来非常复杂. 本质不同的细胞这个条件显然太啰嗦, 是否有些可以挖掘的性质? 1.发现,只要第一次分裂不同,那么互相之间一定是不同的( ...

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

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

  6. 构造类斐波那契数列矩阵

    题目:HDU4565 题意:给定正整数a,b,n,m,求的值. 其中.   分析:依据题意有,所以有结论:,尽管含有根号,可以知道等号右边是 整数.那么我们构造递推关系:,那么本方程的特征根就是:和. ...

  7. P5303 [GXOI/GZOI2019]逼死强迫症(斐波拉契、矩阵乘法)

    解析 非常妙的一个题,感受到了斐波拉契优美的归纳性质. 首先,不难发现只要两个1*1的位置固定,中间的摆法就固定了,而两边的方案都是经典的斐波拉契数列(设为 fif_ifi​). 那么枚举中间的间隔再 ...

  8. 1304 佳佳的斐波那契(矩阵乘法)

    1. 问题描述: 佳佳对数学,尤其对数列十分感兴趣.在研究完 Fibonacci 数列后,他创造出许多稀奇古怪的数列.例如用 S(n) 表示 Fibonacci 前 n 项和 modm 的值,即 S( ...

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

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

最新文章

  1. sequential模型编译时的指标设置:sklearn.metrics:指标
  2. JS数组去重的6种算法实现
  3. Keil生成汇编文件、bin文件
  4. hdu 1086 线段相交
  5. python如何读取文件内容求和_使用python对文件中的数值进行累加的实例
  6. sap中泰国有预扣税设置吗_泰国的绘图标志| Python中的图像处理
  7. 控制工程基础Chapter1 Introduction to Control Systems
  8. 1.swt/rap学习源码网址
  9. 通过python获取浏览器cookie
  10. Python利用GUI界面制作B站弹幕分析工具
  11. firefox无法显示flash问题解决
  12. SEO系列之站内优化
  13. python小写变为大写_在python中改为大写和小写
  14. 我们是怎么看中国企业服务的​
  15. 关于大数据后端粉丝交流群
  16. 使用 Web Speech API 在浏览器中朗读文本
  17. android 吐泡泡动画,android仿摩拜贴纸碰撞|气泡碰撞
  18. 原生js获取元素的子元素
  19. 原生JS,运动的小人
  20. MAC jmeter+ant 实现接口测试并将接口测试报告以邮件的形式发出-超详细

热门文章

  1. Java获取当年以及任意一年的第一天和最后一天 获取当天的开始时间和结束时间 自动获取去年的年份 常用于每年的数据统计
  2. Android开发技巧——自定义控件之组合控件
  3. CP-VTON学习笔记
  4. 显示你个性的鼠标指针(转)
  5. 碎片时间的利用,决定你是否平庸
  6. 基于微信小程序美食攻略点评小程序毕业设计设计与实现毕设开题参考
  7. 可以放GOOGLE广告的博客总汇
  8. 新南威尔士大学计算机博士英语要求,新南威尔士大学博士申请条件
  9. 计算机网络知识详解之:TCP连接原理详解
  10. 吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--编程作业