Fibonacci数列的矩阵快速幂解法
Posted 芜独独
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fibonacci数列的矩阵快速幂解法相关的知识,希望对你有一定的参考价值。
问题描述
输入
输出
样例输入
0
9
999999999
1000000000
-1
样例输出
0
34
626
6875
提示
题意
https://blog.csdn.net/qq_42217376/article/details/102090048
推导过程
参考:https://blog.csdn.net/caoxiaohong1005/article/details/78287920
参考资料
矩阵快速幂参考(重点)
https://blog.csdn.net/qq_40061421/article/details/82625338
https://blog.csdn.net/qq_45432665/article/details/104442553
我的代码
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;//运用命名空间
const int mod = 10000;//Fn的最后四位全为零,则输出' 0 ' ;否则为0 。否则,请省略任何前导零(即,打印Fn mod 10000)。
int n;//输入的项数n
// 奇数时矩阵快速幂乘a
void mul(int f[2],int a[2][2])
int c[2];
memset(c,0,sizeof(c));
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c[j]=(c[j]+(long long)f[k]*a[k][j])%mod;
// memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;
memcpy(f,c,sizeof(c));
// 偶数时矩阵快速幂
void mulself(int a[2][2])
int c[2][2];
memset(c,0,sizeof(c));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c[i][j]=(c[i][j]+(long long)a[i][k]*a[k][j])%mod;
// memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;
memcpy(a,c,sizeof(c));
int main()
while (cin>>n&&n!=-1)
// 初值F(0)
int f[2]=0,1;
// 乘数a
int a[2][2]=0,1,1,1;
//n&1,与运算,可以判断n是否为偶数,如果是偶数,n&1返回0;否则返回1,为奇数.
//n>>=1类似于n+=1,n变成n向右移一位的那个数
for(;n;n>>=1)
//判断n为奇数还是偶数,
if(n&1) mul(f,a);
mulself(a);
cout<<f[0]<<endl;
// 0 9 999999999 1000000000 -1
以上是关于Fibonacci数列的矩阵快速幂解法的主要内容,如果未能解决你的问题,请参考以下文章
poj 3070 Fibonacci(矩阵快速幂求Fibonacci数列)