矩阵快速幂

若有递推式f(n)=a(1)f(n-1)+a(2)f(n-2)++a(m)f(n-m),则可转化为以下矩阵形式:

(你可以自己验算一下)


随后快速幂即可。

(F(n)就相当于求上方n-m+1幂的矩阵经快速幂计算后的矩阵的第一行乘右边那个初始项矩阵)

用 fib(n)fib(n) 表示斐波那契数列的第 nn项,现在要求你求 fib(n)fib(n) mod mmfib(1)=1,fib(2)=1fib(1)=1,fib(2)=1

输入格式

输入 22 个整数 n(1 \le n \le 10^{18})n(1n1018)m(2 \le m \le 100000000)m(2m100000000)

输出格式

输出 fib(n)fib(n) 对 mm 取模的值。

样例输入1
4 10
样例输出1
3
样例输入2
100000000 100000000
样例输出2
60546875


#include<bits/stdc++.h>  
using namespace std;  
typedef long long ll;  
struct matrix{  
    ll a[105][105];  
};  
matrix matrix_mul(matrix A,matrix B, ll mod)//矩阵相乘  
{  
    matrix C;  
    int i,j,k;  
    for(i=0;i<=1;i++)  
    {  
        for(j=0;j<=1;j++)  
        {  
            C.a[i][j]=0;  
            for(k=0;k<=1;k++)  
            {  
                C.a[i][j]+=A.a[i][k]*B.a[k][j]%mod;  
                C.a[i][j]%=mod;  
            }  
        }  
    }  
    return C;  
}  
matrix unit()//获取单位矩阵  
{  
    matrix res;  
    int i,j;  
    for(i=0;i<=1;i++)  
    {  
        for(j=0;j<=1;j++)  
        {  
            if(i==j)  
            res.a[i][j]=1;  
            else  
            res.a[i][j]=0;  
        }  
    }  
    return res;  
}  
matrix matrix_pow(matrix A,ll n,ll mod)//A矩阵的n次幂  
{  
    matrix res=unit(),temp=A;  
    for(;n;n/=2)  
    {  
        if(n&1)  
        res=matrix_mul(res,temp,mod);  
        temp=matrix_mul(temp,temp,mod);  
    }  
    return res;  
}  
int main()  
{  
   ll n,m;  
   cin>>n>>m;  
   if(n<3)  
   printf("1\n");  
   else  
   {  
   //int a[2][2]={1,1,1,0},b[2][1]={1,1};  
   matrix A,B;  
   A.a[0][0]=1;  
   A.a[0][1]=1;  
   A.a[1][0]=1;  
   A.a[1][1]=0;  
   B.a[0][0]=1;  
   B.a[1][0]=1;  
   matrix c;  
   c=matrix_mul(matrix_pow(A,n-2,m),B,m);  
   c=matrix_mul(c,unit(),m);  
   printf("%lld\n",c.a[0][0]);  
}  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值