zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    YOLOv5目标检测源码重磅发布了!
    CSS文本
    CSS3:透明度
    CSS3:HSL和HSLA
    颜色-背景色
    颜色-前景色
    列表 图像 链接
    CSS简介
    标记和插入音频视频
    表单
  • 原文地址:https://www.cnblogs.com/nofind/p/11933470.html
Copyright © 2011-2022 走看看