Hrbust 1475 Blocks(Fibonacci)
来源:互联网 发布:阿里云邮箱 pop3 编辑:程序博客网 时间:2024/05/21 12:39
矩阵递推关系
学过代数的人可以看出,下面这个式子是成立的:
不停地利用这个式子迭代右边的列向量,会得到下面的式子:不停地利用这个式子迭代右边的列向量,会得到下面的式子:
这样,问题就转化为如何计算这个矩阵的n次方了,可以采用快速幂的方法。
学过代数的人可以看出,下面这个式子是成立的:
不停地利用这个式子迭代右边的列向量,会得到下面的式子:不停地利用这个式子迭代右边的列向量,会得到下面的式子:
这样,问题就转化为如何计算这个矩阵的n次方了,可以采用快速幂的方法。
那么只需对系数矩阵迭代就可以了,因为f[0]=1,f[1]=1,计算出系数矩阵的n次方之后取ans[0][0]即可。
#include<iostream>using namespace std;typedef long long LL;const int mod=1e9+7;struct Matrix{int m[2][2];}base,ans;Matrix multi(Matrix a,Matrix b){Matrix tmp;for(int i=0;i<2;i++){for(int j=0;j<2;j++){tmp.m[i][j]=0;for(int k=0;k<2;k++){tmp.m[i][j]=(tmp.m[i][j]+1LL*a.m[i][k]*b.m[k][j])%mod;}}}return tmp;}LL Fibonacci(LL n){ans.m[0][0]=ans.m[1][1]=1;ans.m[0][1]=ans.m[1][0]=0;base.m[0][0]=base.m[0][1]=base.m[1][0]=1;base.m[1][1]=0;while(n){if(n&1)ans=multi(ans,base);base=multi(base,base);n>>=1;}return ans.m[0][0];}int main(){LL n;while(scanf("%lld",&n)&&n){printf("%lld\n",Fibonacci(n));}return 0;}
0 0
- Hrbust 1475 Blocks(Fibonacci)
- hrbust 2190 又是Fibonacci
- hrbust 1241 Blocks【暴力枚举+简单优化】
- hrbust 1209/hdu 4099 Revenge of Fibonacci【字典树+大数】
- hrbust 1048Calculate Fibonacci Recursivel【斐波那契数列】
- hrbust 又是Fibonacci (矩阵快速幂)
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- Hrbust
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- 【备忘】传智播客ios第五期
- 数组的一些介绍与注意点
- sdk - 软件开发工具包
- 开灯问题
- AFNetworking required by Podfile AFNetworking (= 2.6.0) required by Podfile.lock
- Hrbust 1475 Blocks(Fibonacci)
- 余弦相似度-lintcode
- [hihocoder1043]完全背包
- Process输入流输出流及对C++、Python的测试
- getContent()与 ButterKnife.unbind(this)的坑(NollPointerException)
- 解决use -D_SCL_SECURE_NO_WARNINGS
- html复习2
- quartz.net的真实使用(待续)
- python爬虫之爬取百度网盘