Fibonacci 矩阵乘法

斐波那切数列.F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2)

每行输入一个数n和m(n <= 2*10^9 ,m < 10^4)

每行输出F(n)%m.

第 n 个数为:

┌          ┐  ^n  ┌  ┐

 |   0 1  |            0

 |   1 1  |            1

└          ┘         └  ┘ 

对应各元素位置:

┌                  ┐

 |   [0]   [1]   |

 |   [2]   [3]   |

└                  ┘

通过调用递归函数,计算乘积。时间复杂度:O(log2N)。

代码
#include<stdio.h>
int m, a[4], b[4];
void mult(int t)
{
b[
0]=(a[0]*a[0]+a[1]*a[2])%m;
b[
1]=(a[0]*a[1]+a[1]*a[3])%m;
b[
2]=(a[2]*a[0]+a[3]*a[2])%m;
b[
3]=(a[2]*a[1]+a[3]*a[3])%m;
a[
0]=b[0];
a[
1]=b[1];
a[
2]=b[2];
a[
3]=b[3];
if(t)//1,再乘以初始矩阵[0,1,1,1]
{
b[
0]=a[1]%m;
b[
1]=(a[0]+a[1])%m;
b[
2]=a[3]%m;
b[
3]=(a[2]+a[3])%m;
a[
0]=b[0];
a[
1]=b[1];
a[
2]=b[2];
a[
3]=b[3];
}
}

void fib(int n)
{
if(n == 1) return;
fib(n
>>1);//递归
if(n&1) mult(1);//1,n为odd
else mult(0);//0,n为even
}

int main()
{
int n;
while(scanf("%d%d", &n, &m)!=EOF)
{
a[
0]=0;
a[
1]=a[2]=a[3]=1;
fib(n);
printf(
"%d\n",a[1]);
}
return 0;
}
原文地址:https://www.cnblogs.com/submarinex/p/1941240.html