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 一.哥,我被你 ...
随机推荐
- 9.centos7 安装mysql
sudo yum install libaio # 安装依赖包 检查 MySQL 是否已安装 sudo yum list installed | grep mysql 也可以通过命令 rpm -qa| ...
- RTSP协议概况
RTSP协议概况 简单的交互命令就能实现RTSP对接,C代表Client S代表Server 例如:C1-客户端发的第一个命令 S1-服务器响应的第一个回复 [C1]OPTIONS rtsp://10 ...
- 自定义函数(function)
USE [NC] GO /****** Object: UserDefinedFunction [dbo].[dict_url_channel] Script Date: 2019/5/25 16:4 ...
- 【LOJ】#3043. 「ZJOI2019」线段树
LOJ#3043. 「ZJOI2019」线段树 计数转期望的一道好题-- 每个点设两个变量\(p,q\)表示这个点有\(p\)的概率有标记,有\(q\)的概率到祖先的路径上有个标记 被覆盖的点$0.5 ...
- Linux就该这么学——新手必须掌握的命令之常用的系统工作命令
echo命令 含义:echo命令用于在终端输出字符串或变量提取后的值,格式为 : echo [字符串|$变量] 示例: 将”Linuxprobe.com”输出到终端屏幕的命令为: [root@linu ...
- 从入门到自闭之Python--Django Rest_Framework
核心思想: 缩减编写api接口的代码 Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用.在REST framew ...
- Java设置时区
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
- Adaboost推导
AdaBoost算法推导过程: https://www.jianshu.com/p/0d850d85dcbd
- X86逆向2:提取按钮通杀特征码
本章我们将学习特征码的提取与定位,特征码是软件中一段固定的具有标志性的代码片段,特征码的用途非常广泛,最常见的就是杀毒软件的查杀了,查杀就是根据特征码定位技术实现的,再比如木马的免杀也是修改了特征码的 ...
- HUD 4507 吉哥系列故事——恨7不成妻
传送门 三个限制都可以数位 $dp$ , $dfs$ 是维护当前位,之前各位总和模 $7$ 意义下的值,之前填的数模 $7$ 意义下的值,是否贴着限制 主要现在求的是各个合法数的平方的和,比较恶心 开 ...