BZOJ 4128: Matrix (矩阵BSGS)
类比整数的做法就行了
1A爽哉
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 75;
const int sed = 137;
int n, p;
struct Matrix {
int v[MAXN][MAXN];
Matrix(){ memset(v, 0, sizeof v); }
inline void read() {
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
scanf("%d", &v[i][j]);
}
inline int hash() {
int re = 0;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
re = re * sed + v[i][j];
return re;
}
inline Matrix operator *(const Matrix &o)const {
Matrix re;
for(int k = 1; k <= n; ++k)
for(int i = 1; i <= n; ++i) if(v[i][k])
for(int j = 1; j <= n; ++j) if(o.v[k][j])
re.v[i][j] = (re.v[i][j] + v[i][k] * o.v[k][j]) % p;
return re;
}
inline bool operator ==(const Matrix &o)const {
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
if(v[i][j] != o.v[i][j]) return 0;
return 1;
}
}Zero, One;
inline Matrix qpow(Matrix a, int b) {
Matrix re = One;
while(b) {
if(b & 1) re = re * a;
a = a * a; b >>= 1;
}
return re;
}
map<int, int>myhash;
inline int Baby_Step_Giant_Step(Matrix a, Matrix b) {
if(b == One) return 0;
myhash.clear();
int m = int(sqrt(p)+1);
Matrix base = b;
for(int i = 0; i < m; ++i) {
myhash[base.hash()] = i;
base = a * base; //这里写a*base 和 base*a 都是一样的,因为两边同时乘以矩阵,可以乘在左边也可以乘在右边
}
Matrix tmp = One;
base = qpow(a, m);
for(int i = 1, j; i <= m+1; ++i) {
tmp = tmp * base;
if(myhash.count(j=tmp.hash()))
return i*m - myhash[j];
}
return -1;
}
inline void Pre_Work() {
for(int i = 1; i <= n; One.v[i][i] = 1, ++i);
}
int main() {
scanf("%d%d", &n, &p);
Pre_Work();
Matrix A, B;
A.read(); B.read();
printf("%d\n", Baby_Step_Giant_Step(A, B));
}
BZOJ 4128: Matrix (矩阵BSGS)的更多相关文章
- BZOJ 4128: Matrix
BZOJ 4128: Matrix 标签(空格分隔): OI BZOJ 大步小步 矩阵 费马小定理 Time Limit: 10 Sec Memory Limit: 128 MB Descriptio ...
- bzoj 4128: Matrix ——BSGS&&矩阵快速幂&&哈希
题目 给定矩阵A, B和模数p,求最小的正整数x满足 A^x = B(mod p). 分析 与整数的离散对数类似,只不过普通乘法换乘了矩阵乘法. 由于矩阵的求逆麻烦,使用 $A^{km-t} = B( ...
- BZOJ 4128 Matrix BSGS+矩阵求逆
题意:链接 方法: BSGS+矩阵求逆 解析: 这题就是把Ax=B(mod C)的A和B换成了矩阵. 然而别的地方并没有修改. 所以就涉及到矩阵的逆元这个问题. 矩阵的逆元怎么求呢? 先在原矩阵后接一 ...
- BZOJ 4128 Matrix ——BSGS
矩阵的BSGS. 只需要哈希一下存起来就可以了. 也并不需要求逆. #include <map> #include <cmath> #include <cstdio> ...
- bzoj4128 Matrix 矩阵 BSGS
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4128 题解 想了十分钟没有任何思路. 然后一眼瞥见一句话"数据保证在 \(p\) 内 ...
- 【CSS3】 理解CSS3 transform中的Matrix(矩阵)
理解CSS3 transform中的Matrix(矩阵) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu ...
- 理解CSS3 transform中的Matrix(矩阵)
一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如“拉普拉斯不等式”).这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面“Matrix(矩阵) ...
- HDU5015 233 Matrix(矩阵高速幂)
HDU5015 233 Matrix(矩阵高速幂) 题目链接 题目大意: 给出n∗m矩阵,给出第一行a01, a02, a03 ...a0m (各自是233, 2333, 23333...), 再给定 ...
- 理解CSS3 transform中的Matrix(矩阵)——张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2427 一.哥,我被你 ...
随机推荐
- EMR日常操作
1/ 数据root密码修改后emr配置修改: 2/ 添加s3访问 S3:hadoop-aws-2.8.5.jarjar -tfv hadoop-aws-2.8.5.jar |grep S3FileSy ...
- Linux下测试ZLAN 5800
今天师兄让帮忙测试ZLAN 5800八串口通信模块,windows下的测试按照手册来已经搞定,接下来是Linux下的测试. 因为厂家不提供Linux下的相关资料,所以需要在windows下设置好后直接 ...
- IDEA自动生成的注释模板
使用效果如下: * * @功能描述 : $params$ * @return $returns$ * @author xuetao */ 其中 $params$的表达式如下: groovyScript ...
- E.XKC's basketball team(The Preliminary Contest for ICPC Asia Xuzhou 2019)
https://nanti.jisuanke.com/t/41387 解: 离散化+线段树. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); ...
- 【计数】Simple Addition Expression
[来源] 2008年哈尔滨区域赛 [题目链接]: http://acm.hdu.edu.cn/showproblem.php?pid=2451 [参考博客]: HDU 2451 Simple Addi ...
- 8.bash编辑命令行
8.编辑命令行本章介绍 GNU 命令行编辑界面的基本功能.命令行编辑是 Readline 库提供的:这个库被几个不同的程序共用,Bash 是其中一个.使用交互式的 shell 时,默认已经打开了命令行 ...
- 使用Enablebuffering多次读取Asp Net Core 请求体
使用Enablebuffering多次读取Asp Net Core 请求体 1 .Net Core 2.X时代 使用EnableRewind倒带 public IActionResult Index( ...
- EasyUI_DataGrid数据操作
1.html: <div style="width: 1100px;height: 350px ;overflow: scroll"> <table id=&qu ...
- 【原创】大叔经验分享(65)spark读取不到hive表
spark 2.4.3 spark读取hive表,步骤: 1)hive-site.xml hive-site.xml放到$SPARK_HOME/conf下 2)enableHiveSupport Sp ...
- 转:git常用操作
转自:https://www.cnblogs.com/donghaojun/p/10906981.html 开发常用git指令:git init # 初始化本地git环境 git clone xxx ...