[P1962]斐波那契数列
2017-03-31 14:29
183 查看
原题链接
一接过题来
不就是斐波那契数列吗
入门级
但是哦
数据范围是
int64
所以
只能用一个新的东西啦
矩阵快速幂
构建一个矩阵A
使矩阵f
,f[n-1]*A=f[n+1],f
那么我们只需要使f[2],f[1]*A^n-2
就能得到我们的f
一接过题来
不就是斐波那契数列吗
入门级
但是哦
数据范围是
int64
所以
只能用一个新的东西啦
矩阵快速幂
构建一个矩阵A
使矩阵f
,f[n-1]*A=f[n+1],f
那么我们只需要使f[2],f[1]*A^n-2
就能得到我们的f
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<queue> #include<vector> #define mod 1000000007 using namespace std; long long A1[3][3]= { 0,0,0, 0,1,1, 0,1,0, }; long long n,x,num[3]={0,1,1},bak[3][3],i,j,p,ans,mid[3]; void powA() { while(x>1) { p=x%2; x=x/2; if(p==1) { mid[1]=((num[1]*A1[1][1])%mod+(num[2]*A1[2][1])%mod)%mod; mid[2]=((num[1]*A1[1][2])%mod+(num[2]*A1[2][2])%mod)%mod; num[1]=mid[1]; num[2]=mid[2]; } for(i=1;i<=2;i++) for(j=1;j<=2;j++) bak[i][j]=((A1[i][1]*A1[1][j])%mod+(A1[i][2]*A1[2][j])%mod)%mod; for(i=1;i<=2;i++) for(j=1;j<=2;j++) A1[i][j]=bak[i][j]; } } int main() { scanf("%lld",&n); if(n<=2) { printf("%lld",num ); return 0; } x=n-2; powA(); ans=((num[1]*A1[1][1])%mod+(num[2]*A1[2][1])%mod)%mod; printf("%lld",ans); return 0; }
相关文章推荐
- P1962 斐波那契数列
- 【洛谷P1962 斐波那契数列】矩阵快速幂+数学推导
- 洛谷—— P1962 斐波那契数列
- [LUOGU] P1962 斐波那契数列
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
- 矩阵——P1962 斐波那契数列
- 洛谷P1962 斐波那契数列【矩阵运算】
- 洛谷P1962 斐波那契数列
- P1962 斐波那契数列
- 洛谷_P1962_斐波那契数列
- AC日记——斐波那契数列 洛谷 P1962
- 洛谷 P1962 斐波那契数列
- 求斐波那契数列第N位的值
- “斐波那契数列”问题的递推算法
- 斐波那契数列非递归计算
- 斐波那契数列 农夫养牛问题(转载)
- 【程序11】斐波那契数列
- 再一次对数学与自然无语——即斐波那契数列
- 求助---斐波那契数列
- 斐波那契数列性质