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;
}
/**************************************************************************
                 
原文来自博客园——Submarinex的博客: www.cnblogs.com/submarinex/               
 
*************************************************************************/