BZOJ4128 Matrix

题意

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;
}
posted @ 2019-11-26 09:58  nofind  阅读(97)  评论(0编辑  收藏  举报