矩阵快速幂求斐波那契数列

矩阵快速幂求斐波那契数列

( F i b o n a c c i [ i ] F i b o n a c c i [ i − 1 ] ) ¥ ( 1 1 1 0 ) ∗ ( F i b o n a c c i [ i − 1 ] F i b o n a c c i [ i − 2 ] ) ¥ 有 递 推 关 系 可 得 ¥ ( F i b o n a c c i [ i ] F i b o n a c c i [ i − 1 ] ) ¥ ( 1 1 1 0 ) i − 1 ∗ ( F i b o n a c c i [ 1 ] F i b o n a c c i [ 2 ] ) \left( \begin{array}{l} & Fibonacci[i] &\\ & Fibonacci[i-1] & \end{array} \right) ¥ \left( \begin{array}{l} & 1 & 1 &\\ & 1 & 0 & \end{array} \right) * \left( \begin{array}{l} & Fibonacci[i-1] &\\ & Fibonacci[i-2] & \end{array} \right) ¥ 有递推关系可得 ¥ \left( \begin{array}{l} & Fibonacci[i] &\\ & Fibonacci[i-1] & \end{array} \right) ¥ \left( \begin{array}{l} & 1 & 1 &\\ & 1 & 0 & \end{array} \right)^{i-1} * \left( \begin{array}{l} & Fibonacci[1] &\\ & Fibonacci[2] & \end{array} \right) (Fibonacci[i]Fibonacci[i1])(1110)(Fibonacci[i1]Fibonacci[i2])(Fibonacci[i]Fibonacci[i1])(1110)i1(Fibonacci[1]Fibonacci[2])

此时需要求矩阵的快速幂

回顾一下

快速幂

考虑取模 ( a ∗ b ) (a*b)%c (ab)= ( ( a ((a ((a% c ) ∗ ( b c)*(b c)(b% c ) ) c)) c))% c c c

int power(int a, int n)
{
    int res = 1;
    while(n)
    {
        if(n & 1)
        {
            res *= a;
            res %= mod;
        }
        a *= a;
        a %= mod;
        n >>= 1;
    }
    return res % mod;
}
矩阵快速幂(区别只是将底数换成了矩阵)
int n,mod;
int temp[N][N];	// 辅助数组
int res[N][N],a[N][N];

void mul(int a[][N], int b[][N])
{
    memset(temp,0,sizeof(temp));
    for(int i = 0;i < N;i++)	// 矩阵乘法
    {
        for(int j = 0;j < N;j++)
        {
            for(int k = 0;k < N;k++)
            {
                temp[i][j] += a[i][k]*b[k][j];
            }
        }
    }
    for(int i = 0;i < N;i++)	// 结果复制到a数组中
    {
        for(int j = 0;j < N;j++)
        {
            a[i][j] = temp[i][j];
        }
    }
}

void fun(int n)
{
    memset(res,0,sizeof(res));
    for(int i = 0;i < N;i++)
    {
        res[i][i] = 1;
    }
    while(n)
    {
        if(n & 1)
        {
            mul(res,a);
        }
        mul(a,a);
        m >>= 1;
    }
}
常见递推式:

f [ n ] = a f [ n − 1 ] + b [ f − 2 ] + c f[n] = af[n-1]+b[f-2]+c f[n]=af[n1]+b[f2]+c
( F [ i ] F [ i − 1 ] C ) ¥ ( a b 1 1 0 0 0 0 1 ) ∗ ( F [ i − 1 ] F [ i − 2 ] C ) \left( \begin{array}{l} & F[i] &\\ & F[i-1] & \\ & C & \\ \end{array} \right) ¥ \left( \begin{array}{l} & a & b & 1 &\\ & 1 & 0 & 0 &\\ & 0 & 0 & 1& \end{array} \right) * \left( \begin{array}{l} & F[i-1] &\\ & F[i-2] &\\ & C & \end{array} \right) F[i]F[i1]Ca10b00101F[i1]F[i2]C
f [ n ] = c n − f [ n − 1 ] f[n] = c^n-f[n-1] f[n]=cnf[n1]
( F [ i ] c n ) ¥ ( − 1 c 0 c ) ∗ ( F [ i − 1 ] c i − 1 ) \left( \begin{array}{l} & F[i] &\\ & c^n & \end{array} \right) ¥ \left( \begin{array}{l} & -1 & c &\\ & 0 & c & \end{array} \right) * \left( \begin{array}{l} & F[i-1] &\\ & c^{i-1} & \end{array} \right) (F[i]cn)(10cc)(F[i1]ci1)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值