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 ;
}

 

你可能感兴趣的:(fibonacci)