/*//////////////////////////////
HDU 2604 快速矩阵幂
给出长度L,里面有2^L个人求E队列的数量。
分析:
由题意可知,f(0)=0 f(1)=2 f(2)=4
f(3)=6 f(4)=9
当x>=5时 f(n)=f(n-1)+f(n-3)+f(n-4)
构造出 初始矩阵A 乘法矩阵E
9 6 4 2 1 1 0 0
A= 0 0 0 0 E= 0 0 1 0
0 0 0 0 1 0 0 1
0 0 0 0 1 0 0 0
//////////////////////////////*/
#include <cstdio>
#include <cstring>
int n,mod;
struct Matrix
{
int m[4][4];
void clear()
{
memset(m,0,sizeof(m));
}
}E, Z;
Matrix Mut(Matrix A, Matrix B)
{
Matrix ans;
for (int i = 0; i<4; i++)
for (int j = 0; j<4; j++)
{
ans.m[i][j] = 0;
for (int k = 0; k<4; k++)
{
ans.m[i][j] += ((A.m[i][k])*(B.m[k][j]));
ans.m[i][j] %= mod;
}
}
return ans;
}
Matrix Pow(Matrix A, int b)
{
Matrix t = A, ans = E;
while (b)
{
if (b % 2)
ans = Mut(ans, t);
b /= 2;
t = Mut(t, t);
}
return ans;
}
int main()
{
//freopen("in.txt", "r", stdin);
Matrix A;
int f[5]={0,2,4,6,9};
A.clear();
for(int i=0;i<4;i++)
{
A.m[0][i]=f[4-i];
}
int L;
while(scanf("%d %d",&L,&mod)!=EOF)
{
//初始化E
if(L<5)
{
printf("%d\n",f[L]%mod);
continue;
}
E.clear();
for(int i=1;i<=3;i++)
E.m[i-1][i]=1;
E.m[0][0]=1;E.m[2][0]=1;E.m[3][0]=1;
Matrix ans=Pow(E,L-5);
ans=Mut(A,ans);
printf("%d\n",ans.m[0][0]%mod);
}
return 0;
}
快速矩阵幂HDU2604
最新推荐文章于 2025-09-10 14:02:06 发布