题意
BSGS放在矩阵上。
code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=75;
int n,mod;
struct Mat
{
int a[maxn][maxn];
Mat(){memset(a,0,sizeof(a));}
int* operator[](const int i){return a[i];}
inline void idx(){for(int i=1;i<=n;i++)a[i][i]=1;}
bool operator <(const Mat x)const
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]!=x.a[i][j])return a[i][j]<x.a[i][j];
return 0;
}
}A,B;
Mat operator*(Mat x,Mat y)
{
Mat res;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
res[i][j]=(res[i][j]+x[i][k]*y[k][j]%mod)%mod;
return res;
}
Mat operator^(Mat x,int k)
{
Mat res;res.idx();
while(k)
{
if(k&1)res=res*x;
x=x*x;k>>=1;
}
return res;
}
inline int BSGS(Mat a,Mat b)
{
map<Mat,int>mp;
int t=ceil(sqrt(mod));
Mat now;now.idx();
for(int i=0;i<=t;i++)mp[now*b]=i,now=now*a;
a=a^t;
now=a;
for(int i=1;i<=t;i++)
{
if(mp.count(now))return i*t-mp[now];
now=now*a;
}
return -1;
}
int main()
{
scanf("%d%d",&n,&mod);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&A[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&B[i][j]);
printf("%d",BSGS(A,B));
return 0;
}