矩阵

struct Matrix{
    int n,m,mod,a[N][N];
    inline Matrix(int x=0,int y=0,int p=0){
        memset(a,0,sizeof(a));
        n=x,m=y,mod=p;
    }
    inline void reset(int x,int y,int p){
        n=x,m=y,mod=p;
    }
    inline void fill(int x){
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)a[i][j]=x;
    }
    inline int*operator [](int x){
        return a[x];
    }
    inline int&operator()(int x,int y){
        return a[x][y];
    }
    inline bool operator==(const Matrix&b){
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]!=b.a[i][j])return false;
        return true;
    }
    inline bool operator!=(const Matrix&b){
        return !(*this==b);
    }
    inline Matrix operator=(const Matrix&b){
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)a[i][j]=b.a[i][j];
        return *this;
    }
    inline Matrix operator+(const Matrix&b){
        Matrix c(n,m,mod);
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)c.a[i][j]=(a[i][j]+b.a[i][j])%mod;
        return c;
    }
    inline Matrix operator-(const Matrix&b){
        Matrix c(n,m,mod);
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)c.a[i][j]=(a[i][j]-b.a[i][j]+mod)%mod;
        return c;
    }
    inline Matrix operator*(const Matrix&b){
        Matrix c(n,m,mod);
        for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)c.a[i][j]=(c.a[i][j]+a[i][k]*b.a[k][j])%mod;
        return c;
    }
    inline Matrix operator^(int k){
        Matrix b=*this,c(n,n,mod);
        for(int i=1;i<=n;i++)c[i][i]=1;
        for(;k;k>>=1,b*=b)(k&1)&&(c*=b,0);
        return c;
    }
    inline Matrix operator+=(const Matrix&b){
        return *this=*this+b;
    }
    inline Matrix operator-=(const Matrix&b){
        return *this=*this-b;
    }
    inline Matrix operator*=(const Matrix&b){
        return *this=*this*b;
    }
    inline Matrix operator^=(int k){
        return *this=*this^k;
    }
};

矩阵判等,用它去×一个n1的矩阵,得到一个n1的矩阵,即可O(n)判等,预处理:

	for(int i=1;i<=n;i++)c[i][1]=num[i]=rand()%mod;
	for(int i=0;i<m;i++)has[i]=b.mul(b,c),c=a.mul(a,c);
	a^=m;
	for(int i=1;i<=n;i++)c[i][1]=num[i];
	for(int i=1;i<=m;i++){
		c=a.mul(a,c);
		for(int j=m-1;~j;j--)if(c.equal(c,has[j])){
			printf("%lld\n",i*m-j);
			return 0;
		}
	}
posted @ 2022-11-14 17:43  半步蒟蒻  阅读(105)  评论(0)    收藏  举报