描述
用 矩阵快速幂 求 斐波那契数列
输入描述
每行一个整数 i ,表示 Fibonacci 数列的第 i 项。 i≤10000000
输出描述
对每个整数 i,输出 Fibonacci 数列的第 i 项对 100000009 取模的结果。
用例输入 1
1 3 20
用例输出 1
1 2 6765
代码如下
#include<stdio.h>
#define max 100000009
int main()
{
long long int n,c[2][2];
while(scanf("%lld",&n)!=EOF){
long long int a[2][2]={{0,1},{1,1}};
long long int b[2][2]={{1,1}};
while(n>0)
{
if(n&1){
//检查 n 是否为奇数。n & 1 是按位与运算,如果 n 的最低位是1,则结果为1,否则为0。当 n 为奇数时,执行接下来的矩阵乘法。
c[0][0]=(a[0][0]*b[0][0]+a[0][1]*b[1][0])%max;
c[0][1]=(a[0][0]*b[0][1]+a[0][1]*b[1][1])%max;
c[1][0]=(a[1][0]*b[0][0]+a[1][1]*b[1][0])%max;
c[1][1]=(a[1][0]*b[0][1]+a[1][1]*b[1][1])%max;
//将矩阵 c 的内容复制给矩阵 b
b[0][0]=c[0][0];
b[0][1]=c[0][1];
b[1][0]=c[1][0];
b[1][1]=c[1][1];
}
n/=2; //将 n 右移一位
c[0][0]=(a[0][0]*a[0][0]+a[0][1]*a[1][0])%max;
c[0][1]=(a[0][0]*a[0][1]+a[0][1]*a[1][1])%max;
c[1][0]=(a[1][0]*a[0][0]+a[1][1]*a[1][0])%max;
c[1][1]=(a[1][0]*a[0][1]+a[1][1]*a[1][1])%max;
//a 更新为 a 的平方
a[0][0]=c[0][0];
a[0][1]=c[0][1];
a[1][0]=c[1][0];
a[1][1]=c[1][1];
}
printf("%lld\n",b[1][1]);
}
return 0;
}