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;
    }
    
  • 相关阅读:
    大数据之 Spark
    设计模式之——外观or门面模式
    架构设计
    Spring
    高并发系列之——负载均衡,web负载均衡
    高并发系列之——原子性和可见性
    高并发系列之——缓存中间件Redis
    mybatis
    JVM读书笔记
    mybatis中一对一关系映射
  • 原文地址:https://www.cnblogs.com/nofind/p/11933470.html
Copyright © 2011-2022 走看看