[BZOJ4128]Matrix(BSGS+矩乘)
2017-05-11 22:19
260 查看
题目描述
传送门题目大意:给出矩阵AB和模数p,求最小的正整数x,满足Ax≡B(modp)
题解
裸的BSGS,直接换成矩阵乘法就好了注意map里放结构体的话要重载一下<和==
代码
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> using namespace std; #define N 75 struct data { int a ; bool operator == (const data &b) const { for (int i=1;i<=70;++i) for (int j=1;j<=70;++j) if (a[i][j]!=b.a[i][j]) return 0; return 1; } bool operator < (const data &b) const { for (int i=1;i<=70;++i) for (int j=1;j<=70;++j) { if (a[i][j]<b.a[i][j]) return 1; if (a[i][j]>b.a[i][j]) return 0; } return 0; } }zero,unit,A,B,A_m; int n,ans,m,p; map <data,int> hash; data cheng(data a,data b) { data ans=zero; for (int k=1;k<=n;++k) for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j]%p)%p; return ans; } data fast_pow(data a,int p) { data ans=unit; for (;p;p>>=1,a=cheng(a,a)) if (p&1) ans=cheng(ans,a); return ans; } int main() { scanf("%d%d",&n,&p); for (int i=1;i<=n;++i) unit.a[i][i]=1; for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) scanf("%d",&A.a[i][j]); for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) scanf("%d",&B.a[i][j]); m=ceil(sqrt(p)); A_m=fast_pow(A,m); data mi=B; hash[mi]=1; for (int i=1;i<=m;++i) { mi=cheng(mi,A); hash[mi]=i+1; } mi=unit; for (int i=1;i<=m;++i) { mi=cheng(mi,A_m); if (hash[mi]) { ans=i*m-hash[mi]+1; break; } } printf("%d\n",ans); }
相关文章推荐
- BZOJ4128: Matrix 矩阵BSGS
- 【BZOJ4128】Matrix,拔山盖世的矩阵乘法+随机化
- [BSGS 矩阵 随机化] BZOJ 4128 Matrix
- 【BZOJ 4128】 matrix
- [BZOJ 4128]Matrix
- Bzoj4128 Matrix
- BZOJ 4128 Matrix Baby-Step-Giant-Step+矩阵求逆
- BZOJ_4128_Matrix_矩阵乘法+哈希+BSGS
- BZOJ 4128: Matrix
- bzoj4128 Matrix BSGS&hash
- 【BZOJ4128】Matrix BSGS+hash
- BZOJ 4128 Matrix
- BZOJ 4128 Matrix ——BSGS
- bzoj 4031 [HEOI2015]小Z的房间 Matrix-tree定理
- bzoj 4128 矩阵求逆
- bzoj 2351: [BeiJing2011]Matrix(二维Hash)
- [bzoj2351][BeiJing2011]Matrix 哈希
- BZOJ 2351: [BeiJing2011]Matrix
- BZOJ 2351 BeiJing2011 Matrix Hash
- BZOJ 1016 [JSOI2008]最小生成树计数 Kruskal Matrix-Tree定理