#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);
}
}
矩阵快速幂
最新推荐文章于 2023-02-11 18:05:48 发布