M斐波那契数列

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1609    Accepted Submission(s): 460

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)
 
详解:

F(n)=F(n-1)*F(n-2)
F(1)=a;
F(2)=b;
F(3)=a^1*b^1
F(4)=a^1*b^2
F(5)=a^2*b^3
F(6)=a^3*b^5
F(n)=a^f(n'-1)*b^f(n'), f(n')为斐波拉契数列

这样就可以先算出F(n)对应f(n')、f(n'-1),再二分快速幂,F(n)=a^f(n'-1)%MOD*b^f(n')%MOD
另外由于n比较大且MOD为质数,则根据费马小定理得:F(n)=a^(f(n'-1)%(MOD-1)%MOD) * b^(f(n')%(MOD-1))%MOD
注意这里n'和n不一样,当n为3时,f(n')=1,不妨让n'=n-2...

#include <iostream>
#include <cstdio>
using namespace std;
#define MOD 1000000007
#define ll __int64
#define N 2 ll quickadd(ll a,ll b) //矩阵快速加,防溢出,其实可以不用这个
{
ll ret=;
while(b)
{
if(b&)
{
ret+=a;
if(ret>=MOD) ret-=MOD;
}
a<<=;
if(a>=MOD) a-=MOD;
b>>=;
}
return ret;
}
ll quickpow(ll a,ll b) //矩阵快速幂
{
ll ret=;
while(b)
{
if (b&) ret=quickadd(a,ret);
a=quickadd(a,a);
b>>=;
}
return ret;
}
void mul(ll a[N][N],ll b[N][N]) //矩阵相乘
{
ll i,j,k;
ll c[N][N]={};
for(i=;i<N;i++)
{
for(j=;j<N;j++)
{
for(k=;k<N;k++)
{
c[i][j]=(c[i][j]+a[i][k]*b[k][j])%(MOD-);
}
}
}
for(i=;i<N;i++)
{
for(j=;j<N;j++)
{
a[i][j]=c[i][j];
}
}
}
int main()
{
ll A,B,n;
while(scanf("%I64d%I64d%I64d",&A,&B,&n)!=EOF)
{
if(n==) printf("%I64d\n",A%MOD);
else if(n==) printf("%I64d\n",B%MOD); //特判0,1
else
{
n-=;
ll a[N][N]={,},b[N][N]={,,,};
while(n)
{
if(n&)mul(a,b);
mul(b,b);
n>>=;
}
ll k1=a[][];
ll k2=a[][];
ll ans=;
ans=ans*quickpow(A,k1)%MOD;
ans=ans*quickpow(B,k2)%MOD;
printf("%I64d\n",ans);
}
}
return ;
}

[HDU 4549] M斐波那契数列的更多相关文章

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

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...

  2. HDU 4549 M斐波那契数列(矩阵快速幂)

    题目链接:M斐波那契数列 题意:$F[0]=a,F[1]=b,F[n]=F[n-1]*F[n-2]$.给定$a,b,n$,求$F[n]$. 题解:暴力打表后发现$ F[n]=a^{fib(n-1)} ...

  3. hdu 4549 M斐波那契数列 矩阵快速幂+欧拉定理

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem ...

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

    M斐波那契数列 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submi ...

  5. hdu 4549 M斐波那契数列(矩阵高速幂,高速幂降幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=4549 f[0] = a^1*b^0%p,f[1] = a^0*b^1%p,f[2] = a^1*b^1%p... ...

  6. HDU 4549 M斐波那契数列(矩阵幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4549 题意:F[0]=a,F[1]=b,F[n]=F[n-1]*F[n-2]. 思路:手算一下可以发现 ...

  7. HDU 1316 (斐波那契数列,大数相加,大数比较大小)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1316 Recall the definition of the Fibonacci numbers: ...

  8. HDU 5451 广义斐波那契数列

    这道题目可以先转化: 令f(1) = 5+2√6 f(2) = f(1)*(5+2√6) ... f(n) = f(n-1)*(5+2√6) f(n) = f(n-1)*(10-(5-2√6)) = ...

  9. hdu 4549 M斐波拉契 (矩阵快速幂 + 费马小定理)

    Problem DescriptionM斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在 ...

随机推荐

  1. lucene4.0 基于smb文件服务器的全文检索

    使用lucene 4.0版本的全文检索 所需要的jar包  网速太慢,下次有空再把jar传上来 1.FileIndex  建立索引,查询,删除,更新 package com.strongit.tool ...

  2. ZOJ 2411 Link Link Look(BFS)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1411 题目大意:连连看,给出每次连线的两个坐标,求能消去多少方块,拐 ...

  3. js闭包的使用例子

    网上关于闭包的介绍太多,这就导致了泛滥,对于新手来说,网上好多讲解就说了闭包是啥,还都是用下面这种例子: 我的天啊,我们都看了不知道多少遍了,看完有啥用?在什么场合下用啊? 于是我翻阅各种资料,自己总 ...

  4. Linux网络应用编程之VLAN(Packet Tracer仿真)

    VLAN 一.VLAN概述 VLAN(虚拟局域网):将多个设备和用户在逻辑上联网在一起,这些设备和用户不受物理位置的限制(物理设备可以在不同的地方),但是他们的通信就好像在同一网段中一样,这就叫VLA ...

  5. 关于解决JQuery发送Ajax请求后,IE缓存数据不更新的问题

    http://www.cnblogs.com/lys_013/archive/2013/08/07/3243435.html 今天在做ajax页面无刷新请求后台服务器数据的时候,IE下遭遇Ajax缓存 ...

  6. php新特性--持续更新

    命名空间 在其他语言中不算新鲜事,但php是5.3.0中引入,具体定义就不复述了,其主要作用是 封装和组织相关php类 .命名空间被引入之前php主要是通过Zend方式组织代码,这种方式带来的问题是类 ...

  7. Dreamweaver 添加 cakephp ctp后缀名

    Dreamweaver 默认是不支持ctp文件高亮的,即使用Dreamweaver打开ctp文件,也只能像记事本一样编辑 但是我们可以通过修改两个文件,来添加Dreamweaver对ctp文件的扩展支 ...

  8. Windows 下Python操作MySQL

    1.环境要求(Win7 X64): python 2.7, MySQL-python-1.2.3.win-amd64-py2.7 :http://www.codegood.com/download/1 ...

  9. python27读书笔记0.1

    --Notes: 测试环境:Windows ,python 2.7.3,python 自带的IDLE #-*- coding: utf-8 -*- # First Lesson# --- Line s ...

  10. hdu 5172 GTY's gay friends

    GTY's gay friends 题意:给n个数和m次查询:(1<n,m<1000,000);之后输入n个数值(1 <= ai <= n):问下面m次查询[L,R]中是否存在 ...