矩阵快速幂

来源:互联网 发布:淘宝医药商城 编辑:程序博客网 时间:2024/06/07 05:50
#include<stdio.h>#include<string.h>int mod;struct matrix{    int a[5][5];}E;int pow_mod(int a,int b){    int res=1;    while(b)    {        if(b&1) res=res*a%mod;        a=a*a%mod;        b>>=1;    }    return res;}matrix matrix_mul(matrix A,matrix B){    matrix c;    memset(c.a,0,sizeof(c.a));    for(int i=0;i<5;i++)        for(int j=0;j<5;j++)            for(int k=0;k<5;k++)                c.a[i][j]=(c.a[i][j]+A.a[i][k]*B.a[k][j])%mod;    return c;}void matrix_pow(matrix A,int k){    matrix e=E;    int ans=pow_mod(2,k+2);    while(k)    {        if(k&1) e=matrix_mul(e,A);        A=matrix_mul(A,A);        k>>=1;    }    printf("%d\n",((ans-(e.a[4][0]+e.a[4][1]+e.a[4][2]+e.a[4][3]))%mod+mod)%mod);}int main(){    int i,k;    matrix A;    memset(A.a,0,sizeof(A.a));    A.a[0][3]=A.a[1][1]=A.a[1][2]=A.a[2][0]=A.a[2][3]=A.a[3][1]=A.a[4][0]=A.a[4][2]=1;    A.a[4][4]=2;    memset(E.a,0,sizeof(E.a));    for(i=0;i<5;i++) E.a[i][i]=1;    while(scanf("%d%d",&k,&mod)!=EOF)    {        if(k<3) printf("0\n");        else matrix_pow(A,k-2);    }}

0 0
原创粉丝点击