矩阵
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;
}
}