HDOJ 4549 M斐波那契数列 费马小定理+矩阵高速幂
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
F[0] = a
F[1] = b
F[n] = F[n-1] * F[n-2] ( n > 1 )
如今给出a, b, n,你能求出F[n]的值吗?
每组数据占一行,包括3个整数a, b, n( 0 <= a, b, n <= 10^9 )
0 1 0 6 10 2
0 60
- /* ***********************************************
- 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斐波那契数列 费马小定理+矩阵高速幂的更多相关文章
- HDU4549 M斐波那契数列 —— 斐波那契、费马小定理、矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-4549 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Li ...
- HDU----(4549)M斐波那契数列(小费马引理+快速矩阵幂)
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- 【费马小定理+矩阵快速幂】HDU4549——M斐波那契数列
[题目大意] M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )现在给出a, b, n,求出F[ ...
- HDU 4549 (费马小定理+矩阵快速幂+二分快速幂)
M斐波那契数列 Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Statu ...
- 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 ...
- HDOJ 5667 Sequence//费马小定理 矩阵快速幂
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5667 题意:如题给了一个函数式,给你a,b,c,n,p的值,叫你求f(n)%p的值 思路:先对函数取以a为 ...
- bzoj5118: Fib数列2(费马小定理+矩阵快速幂)
题目大意:求$fib(2^n)$ 就是求fib矩阵的(2^n)次方%p,p是质数,根据费马小定理有 注意因为模数比较大会爆LL,得写快速乘法... #include<bits/stdc++.h& ...
- HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)
M斐波那契数列 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submi ...
- Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...
随机推荐
- Java solr 索引数据增删改查
具体代码如下: import java.io.IOException; import java.util.*; import org.apache.solr.client.solrj.SolrClie ...
- 【Linux】pv vg lv, 加盘,扩容磁盘
PV VG LV关系:一个物理盘(或一个lun)就是一个pv,有几个物理盘就有几个pv.一个或者几个硬盘可以组成一个vg,一个系统可以包括好几个vg,比如rootvg ,datavg等 PV组成VG, ...
- 如何在不重启或重新格式化hadoop集群的情况下删除集群节点
在master节点上的hadoop安装目录下 进入conf目录 配置hdfs-site.xml文件 添加节点如下: <property> <name>dfs.hosts.exc ...
- Python3环境安装Scrapy爬虫框架过程及常见错误
收录待用,修改转载已取得腾讯云授权 Scrapy安装介绍 Scrapy的安装有多种方式,它支持Python2.7版本及以上或Python3.3版本及以上.下面说明Python3环境下的安装过程. Sc ...
- Solr报错Index locked for write for core '***'. Solr now longer supports forceful unlocking via 'unlockOnStartup'
unlockOnStartup 告知 Solr 忽略在多线程环境中用来保护索引的锁定机制.在某些情况下,索引可能会由于不正确的关机或其他错误而一直处于锁定,这就妨碍了添加和更新.将其设置为 true ...
- non-compatible bean definition of same name and class
在整合struts2.1.6+spring2.5.6开发中,使用了注解和struts-convention来实现零配置管理.spring也使用注解annotation方式.现在的问题是:我在连个个不同 ...
- EffectManager
using UnityEngine; using System.Collections; public class EffectManager : MonoBehaviour { public Ani ...
- Android开发之Is Library篇
一.生活场景描述 由于公司有一个项目开发的时间比较长,项目里堆砌的代码也比较多,并且有些功能在给不同客户发布的时候有些功能还不需要,这样功能模块分离就很有必要了. 所以,Library就被推到了前台, ...
- C语言中函数调用过程(如何管理栈空间)
ps:先做草稿,以后有时间再整理并贴图,:) 主要是利用栈底寄存器(ebp).栈顶寄存器(esp)跟eax寄存器(存储返回值)来实现. 假设P调用Q: P() { Q(1,2); } (跟实际情况可能 ...
- loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式
loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式 分类: 心得 loadrunner 我的测试 2012-04-01 12:52 2340人阅读 评论(0) 收藏 举报 脚本l ...