MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i )   ( i>=3)

mod 1000000007
是质数 , 依据费马小定理  a^phi( p ) = 1 ( mod p )  这里 p 为质数 且 a 比 p小 所以 a^( p - 1 ) = 1 ( mod p )

所以对非常大的指数能够化简  a ^ k % p  == a ^ ( k %(p-1) ) % p

用矩阵高速幂求fib数后代入就可以

M斐波那契数列

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)

Total Submission(s): 1672    Accepted Submission(s): 482

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
 

/* ***********************************************
Author :CKboss
Created Time :2015年03月12日 星期四 22时44分35秒
File Name :HDOJ4549.cpp
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map> using namespace std; typedef long long int LL; const LL mod=1000000007LL;
const LL md=1000000006LL; /// getfib
LL a,b,n; struct Matrix
{
Matrix(LL a=0,LL b=0,LL c=0,LL d=0)
{
m[0][0]=a; m[0][1]=b;
m[1][0]=c; m[1][1]=d;
}
LL m[2][2];
}; Matrix MUI(Matrix& a,Matrix& b)
{
Matrix ret;
ret.m[0][0]=((a.m[0][0]*b.m[0][0])%md+(a.m[0][1]*b.m[1][0])%md)%md;
ret.m[0][1]=((a.m[0][0]*b.m[0][1])%md+(a.m[0][1]*b.m[1][1])%md)%md;
ret.m[1][0]=((a.m[1][0]*b.m[0][0])%md+(a.m[1][1]*b.m[1][0])%md)%md;
ret.m[1][1]=((a.m[1][0]*b.m[0][1])%md+(a.m[1][1]*b.m[1][1])%md)%md;
return ret;
} Matrix QUICKPOW(LL m)
{
Matrix E(1,0,0,1);
Matrix A(1,1,1,0);
while(m)
{
if(m&1LL) E=MUI(E,A);
A=MUI(A,A);
m/=2LL;
}
return E;
} void showMat(Matrix M)
{
cout<<endl;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
cout<<M.m[i][j]<<",";
cout<<endl;
}
cout<<endl;
} /// get p_th fib number
LL getfib(LL p)
{
p--;
Matrix M1=QUICKPOW(p);
return M1.m[0][0];
} LL QUICKPOW2(LL a,LL x)
{
LL e=1LL;
while(x)
{
if(x&1LL) e=(e*a)%mod;
a=(a*a)%mod;
x/=2LL;
}
return e;
} LL solve()
{
if(n==0) return a;
else if(n==1) return b;
else if(n==2) return (a*b)%mod; ///a的fib系数 -> fib(n-1)
LL xa = getfib(n-1);
LL partA = QUICKPOW2(a,xa); ///b的fib系数 -> fib(i)
LL xb = getfib(n);
LL partB = QUICKPOW2(b,xb); return (partA*partB)%mod;
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout); while(cin>>a>>b>>n)
cout<<solve()<<endl; return 0;
}

HDOJ 4549 M斐波那契数列 费马小定理+矩阵高速幂的更多相关文章

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

    题目链接:https://vjudge.net/problem/HDU-4549 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Li ...

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

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

  3. 【费马小定理+矩阵快速幂】HDU4549——M斐波那契数列

    [题目大意] M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )现在给出a, b, n,求出F[ ...

  4. HDU 4549 (费马小定理+矩阵快速幂+二分快速幂)

    M斐波那契数列 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Statu ...

  5. HDU 1005 Number Sequence【斐波那契数列/循环节找规律/矩阵快速幂/求(A * f(n - 1) + B * f(n - 2)) mod 7】

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. HDOJ 5667 Sequence//费马小定理 矩阵快速幂

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5667 题意:如题给了一个函数式,给你a,b,c,n,p的值,叫你求f(n)%p的值 思路:先对函数取以a为 ...

  7. bzoj5118: Fib数列2(费马小定理+矩阵快速幂)

    题目大意:求$fib(2^n)$ 就是求fib矩阵的(2^n)次方%p,p是质数,根据费马小定理有 注意因为模数比较大会爆LL,得写快速乘法... #include<bits/stdc++.h& ...

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

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

  9. Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)

    Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...

随机推荐

  1. HAWQ技术解析(四) —— 启动停止

            前面已经完毕了HAWQ的安装部署,也了解了HAWQ的系统架构与主要组件,以下開始使用它. HAWQ作为Hadoop上的一个服务提供给用户,与其他全部服务一样.最主要的操作就是启动.停止 ...

  2. Win7如何开启管理员账户

    打开运行对话框,在LUSRMGR.MSC里,左边点用户,在右边栏里右击Administrator选择属性,去掉账户已禁用这个选项前面的勾.我也问过这个问题,确实如版主说的这样可解决这个问题,但有个问题 ...

  3. CentOS 5 全功能WWW服务器搭建全教程 V3.0

    http://hx100.blog.51cto.com/44326/339949/ 一.基本系统安装1.下载CentOS 5我是下载的DVD版本,大家也可以下载服务器CD安装版本,其实都差不多.大家可 ...

  4. Java模式开发之责任链模式

    Java模式开发之责任链模式 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓.击鼓的地方与传花的地方是分开的.以示公正. 開始击鼓时,花束就開始依次传递,鼓 ...

  5. Python基础之字符串的练习

    练习1 #!/usr/bin/python -tt # Copyright 2010 Google Inc. # Licensed under the Apache License, Version ...

  6. C++中string.find()函数与string::npos

    先说说string::npos参数: npos 是一个常数,用来表示不存在的位置,类型一般是std::container_type::size_type 许多容器都提供这个东西.取值由实现决定,一般是 ...

  7. 带圈圈的数字1~50,求50以上,不要word的

    ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿

  8. IOS推送通知測试工具PushMeBaby

    下载了PushMeBaby在xcode5里中不能使用.类库变了.须要加入Carbon.framework库.在引用的地方改成: #include <Carbon/Carbon.h>.程序就 ...

  9. java - day07 - PrimeNum

    判断质数 package day06; import java.util.Scanner; //验证质数 public class primeNum { public static void main ...

  10. 2017-5-14 湘潭市赛 Partial Sum 给n个数,每次操作选择一个L,一个R,表示区间左右端点,该操作产生的贡献为[L+1,R]的和的绝对值-C。 0<=L<R<=n; 如果选过L,R这两个位置,那么以后选择的L,R都不可以再选择这两个位置。最多操作m次,求可以获得的 最大贡献和。

    Partial Sum Accepted : Submit : Time Limit : MS Memory Limit : KB Partial Sum Bobo has a integer seq ...