HDU 4549M斐波那契数列(矩阵快速幂+费马小定理)
来源:互联网 发布:傲剑长生诀数据 编辑:程序博客网 时间:2024/05/16 14:03
M斐波那契数列
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 993 Accepted Submission(s): 293
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]的值吗?
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 )
每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 )
Output
对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行。
Sample Input
0 1 06 10 2
Sample Output
060
Source
2013金山西山居创意游戏程序挑战赛——初赛(2)
题目大意:题目易懂,主要是数据太大。自己了解的降幂公式没有这么吊。这个也不需要讨论。如果mod为质数的话,根据费马小定理可以得到:a^p%(mod)=a^(p%(mod-1)). mod为质数
解题思路:根据题意,慢慢可以推公式。可以得到他们a,b的次数实际上是服从斐波那契数列的,不过需要用到矩阵的快速幂去计算。然后就是快速幂把结果算出来。
详解见代码:
#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<cmath>using namespace std;int mo=1e9+7;__int64 ret[2][2],tmp[2][2],p[2][2];__int64 n;void init() //初始化{ ret[0][0]=1; ret[0][1]=1; ret[1][0]=1; ret[1][1]=0; p[0][0]=1; p[0][1]=1; p[1][0]=1; p[1][1]=0;}void cal1() //!(n&1){ int i,j,k; for(i=0;i<2;i++) for(j=0;j<2;j++) { tmp[i][j]=p[i][j]; p[i][j]=0; } for(i=0;i<2;i++) for(j=0;j<2;j++) for(k=0;k<2;k++) p[i][j]=(p[i][j]+tmp[i][k]*tmp[k][j])%(mo-1);}void cal2() //n&1{ int i,j,k; for(i=0;i<2;i++) for(j=0;j<2;j++) { tmp[i][j]=ret[i][j]; ret[i][j]=0; } for(i=0;i<2;i++) for(j=0;j<2;j++) for(k=0;k<2;k++) ret[i][j]=(ret[i][j]+tmp[i][k]*p[k][j])%(mo-1);}void fastmi() //矩阵的快速幂{ init(); n-=3; while(n) { if(n&1) cal2(); cal1(); n>>=1; }}__int64 pow(__int64 base,__int64 p) //快速幂{ __int64 ans=1; while(p) { if(p&1) ans=(ans*base)%mo; base=(base*base)%mo; p>>=1; } return ans;}int main(){ __int64 a,b; while(~scanf("%I64d%I64d%I64d",&a,&b,&n)) { __int64 ans1,ans2,res1,res2; if(n==0) ans1=1,ans2=0; else if(n==1) ans1=0,ans2=1; else if(n==2) ans1=1,ans2=1; else { fastmi(); ans2=(ret[0][0]+ret[0][1])%(mo-1); //b的次数 ans1=(ret[1][0]+ret[1][1])%(mo-1); //a的次数 //printf("%I64d %I64d\n",ans1,ans2); } res1=pow(a,ans1); res2=pow(b,ans2); __int64 res=(res1*res2)%mo; printf("%I64d\n",res); } return 0;}
- HDU 4549 M斐波那契数列(费马小定理,矩阵快速幂,快速幂)
- HDU 4549 M斐波那契数列 (费马小定理降幂&矩阵快速幂)
- HDU 4549M斐波那契数列(矩阵快速幂+费马小定理)
- HDU - 4549 M斐波那契数列(矩阵快速幂+费马小定理)
- HDU 4549 M斐波那契数列(矩阵快速幂3)+费马小定理
- HDU 4549 M斐波那契数列(矩阵快速幂&费马小定理)
- HDU 4549 M斐波那契数列(矩阵快速幂)(费马小定理)
- HDU --- 4549 M斐波那契数列 【费马小定理+矩阵快速幂】
- HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)
- HDU 4549 M斐波那契数列 (矩阵快速幂+费马小定理)
- HDU 4549 M斐波那契数列 (矩阵快速幂 + 费马小定理)
- HDU 4549 M斐波那契数列 (费马小定理+矩阵快速幂)
- hdu 4549 M斐波那契数列(费马小定理+矩阵快速幂)
- 【费马小定理降幂+矩阵快速幂+快速幂】M斐波那契数列 HDU
- hdu 4549 M斐波那契数列 【矩阵+快速幂+欧拉定理】
- hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)
- HDU——4549M斐波那契数列(矩阵快速幂+快速幂+费马小定理)
- hdoj 4549 M斐波那契数列 【矩阵快速幂 + 费马小定理 + 快速幂】
- Android基础-适配器Adapter
- 最小生成树--poj2485
- Java中方法的覆盖
- Handler学习笔记
- HDU 1097 a hard puzzle
- HDU 4549M斐波那契数列(矩阵快速幂+费马小定理)
- java面向对象详解
- Linux shell的标准输入、输出和错误
- vi ---> emacs
- loadrunner--loadrunner自动关联
- 纪念这一天 2013年8月19号
- 常用字符串处理函数
- IOS网络图片缓存详解
- Vi编辑器的复制操作