【codevs1732】Fibonacci数列 2(矩阵快速幂)
2016-02-24 19:37
225 查看
题目描述
传送门题解
矩阵快速幂模板题,构造的矩阵为[1110]
这样的话,先对构造的这个矩阵进行快速幂,然后再与矩阵
[Fn+1Fn]
相乘,就可以得出最后的答案。(不信的话你可以自己算一下)
矩阵乘法满足分配律和结合律。
代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define LL long long const LL mod=1e9+7; struct hp{ LL a[5][5]; }con; LL n; LL ans[5][5],fib[5][5]; inline hp work(hp a,hp b){ hp c; memset(c.a,0,sizeof(c.a)); for (int i=1;i<=2;++i) for (int j=1;j<=2;++j) for (int k=1;k<=2;++k) c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod; return c; } inline hp fast_pow(hp a,LL p){ hp ans=con; for (;p;p>>=1,a=work(a,a)) if (p&1) ans=work(ans,a); return ans; } int main(){ while (~scanf("%lld",&n)){ if (n==1||n==2){ printf("1\n"); continue; } con.a[1][1]=con.a[1][2]=con.a[2][1]=1; con.a[2][2]=0; if (n>3) con=fast_pow(con,n-3); fib[1][1]=fib[2][1]=1; memset(ans,0,sizeof(ans)); for (int i=1;i<=2;++i) for (int j=1;j<=1;++j) for (int k=1;k<=2;++k) ans[i][j]=(ans[i][j]+con.a[i][k]*fib[k][j]%mod)%mod; printf("%lld\n",ans[1][1]); } }
相关文章推荐
- Linux netstat 命令
- 集群中通过外网8088端口访问不到
- Servlet3.0学习总结——基于Servlet3.0的文件上传
- Android View.post(Runnable )
- swift官方文档和swift视频教程
- POJ - 1256 Anagram
- hasshmap输出value
- 《大话设计模式》Python版代码实现
- 解决集群Hive表注释为?的编码问题
- Codeforces629 C. Famil Door and Brackets
- 不使用额外存储节点的情况下使单链表逆序问题(配图解)
- codeforces 55D
- 理解UART
- C++ 中关于new的介绍
- centos6.5下vsftpd服务的安装及配置并通过pam认证实现虚拟用户文件共享
- centos6.5下vsftpd服务的安装及配置并通过pam认证实现虚拟用户文件共享
- 接口实现Fragment、Activity间互调解耦
- WIN7启动项删除
- leetcode MajorityElement相关问题
- C语言深度剖析-----数组与指针分析