【BZOJ】4128: Matrix
题解
学习一下矩阵求逆
就是我们考虑这个矩阵
\(AA^{-1} = I\)
我们相当于让\(A\)乘上一个矩阵,变成\(I\)
我们可以利用初等行变换(只能应用初等行变换,或只应用初等列变换)
分三种
1.矩阵的两行互换
2.矩阵的一行加上k倍的另一行
3.矩阵的一行都乘上某个数
其实行变换的本质也可以写成一个矩阵!
我们把\(A\)消成1的过程中,对\(I\)进行同样的操作,就可以得到\(A^{-1}\)了
然后用map代替哈希记录一下就行
似乎这题不用求逆也行。。。
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int MOD,N;
int inv[20005];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return a * b % MOD;
}
struct Matrix {
int f[72][72];
Matrix() {memset(f,0,sizeof(f));}
friend Matrix operator * (const Matrix &a,const Matrix &b) {
Matrix c;
for(int i = 1 ; i <= N ; ++i) {
for(int j = 1 ; j <= N ; ++j) {
for(int k = 1 ; k <= N ; ++k) {
c.f[i][j] = inc(c.f[i][j],mul(a.f[i][k],b.f[k][j]));
}
}
}
return c;
}
void unit() {
for(int i = 1 ; i <= N ; ++i) f[i][i] = 1;
}
friend Matrix operator ~(Matrix a) {
Matrix b;
b.unit();
for(int i = 1 ; i <= N ; ++i) {
int l;
for(l = i ; l <= N ; ++l) {
if(a.f[l][i]) break;
}
if(l != i) {
for(int j = 1 ; j <= N ; ++j) {
swap(a.f[l][j],a.f[i][j]);
swap(b.f[l][j],b.f[i][j]);
}
}
int t = inv[a.f[i][i]];
if(t) {
for(int j = 1 ; j <= N ; ++j) {
a.f[i][j] = mul(a.f[i][j],t);
b.f[i][j] = mul(b.f[i][j],t);
}
}
for(int j = 1 ; j <= N ; ++j) {
if(j == i) continue;
int t = a.f[j][i];
if(t) {
for(int k = 1 ; k <= N ; ++k) {
a.f[j][k] = inc(a.f[j][k],MOD - mul(t,a.f[i][k]));
b.f[j][k] = inc(b.f[j][k],MOD - mul(t,b.f[i][k]));
}
}
}
}
return b;
}
friend bool operator < (const Matrix &a,const Matrix &b) {
for(int i = 1 ; i <= N ; ++i) {
for(int j = 1 ; j <= N ; ++j) {
if(a.f[i][j] != b.f[i][j]) return a.f[i][j] < b.f[i][j];
}
}
return false;
}
friend bool operator == (const Matrix &a,const Matrix &b) {
for(int i = 1 ; i <= N ; ++i) {
for(int j = 1 ; j <= N ; ++j) {
if(a.f[i][j] != b.f[i][j]) return false;
}
}
return true;
}
void init() {
for(int i = 1 ; i <= N ; ++i) {
for(int j = 1 ; j <= N ; ++j) {
read(f[i][j]);
}
}
}
}A,B;
map<Matrix ,int> rec;
int BSGS(Matrix a,Matrix b) {
int S = sqrt(MOD);
Matrix t,ia,k;
t.unit();k = b;ia = ~a;
for(int i = 0 ; i < S ; ++i) {
if(t == b && i) return i;
t = t * a;
if(!rec.count(k)) rec[k] = i;
k = k * ia;
}
k = t;
for(int i = 1 ; i * S <= MOD; ++i) {
if(rec.count(k)) return i * S + rec[k];
k = k * t;
}
}
void Solve() {
read(N);read(MOD);
inv[1] = 1;
for(int i = 2 ; i < MOD ; ++i) inv[i] = mul(inv[MOD % i],MOD - MOD / i);
A.init();B.init();
out(BSGS(A,B));enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
【BZOJ】4128: Matrix的更多相关文章
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
- 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- 【BZOJ】【3083】遥远的国度
树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...
- 【BZOJ】【2434】【NOI2011】阿狸的打字机
AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...
- 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法
整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...
- 【BZOJ】【3170】【TJOI2103】松鼠聚会
切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...
随机推荐
- MT【110】巧设法向量解决距离问题
分析:设面的法向量$n=(x,y,z)$
- 【刷题】LOJ 6007 「网络流 24 题」方格取数
题目描述 在一个有 \(m \times n\) 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意 \(2\) 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数 ...
- bzoj1038
这是一道非常有意思的题目 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一 ...
- 面试题:get和post的本质区别
前言:相信小伙伴们面试时候一定都遇到过这个问题,即使没有遇到过,至少也听说过,网上资料一大片,大概每个人都能说出来一些.但是总感觉面试装逼不成功,所以就翻阅了部分资料,进一步整理了下. 一般当我们提到 ...
- ELK应用之一:ELK平台搭建部署
一.获取安装包: EKL官网:https://www.elastic.co/products 二.安装Elasticsearch 2.1.解压安装包,在安装目录创建data和logs目录,并在配置文件 ...
- 翻译:探索GLSL-用几何着色器(着色器库)实现法线可视化
翻译:探索GLSL-用几何着色器(着色器库)实现法线可视化 翻译自: Exploring GLSL – Normal Visualizer with Geometry Shaders (Shader ...
- ngx_lua_API 指令详解(六)ngx.thread.spawn、ngx.thread.wait、ngx.thread.kill介绍
摘要:通过lua-nginx-module中的ngx.thread同时执行多个任务. ngx_lua中访问多个第三方服务 ngx_lua中提供了ngx.socket API,可以方便的访问第三方网络服 ...
- 1601O_HOME
马kaiyu https://blog.csdn.net/debugbugbg 胡guoxin https://blog.csdn.net/qq_41995727 张yizhong https: ...
- 通俗理解决策树中的熵&条件熵&信息增益
参考通俗理解决策树算法中的信息增益 说到决策树就要知道如下概念: 熵:表示一个随机变量的复杂性或者不确定性. 假如双十一我要剁手买一件衣服,但是我一直犹豫着要不要买,我决定买这件事的不确定性(熵)为2 ...
- Nginx是什么,有什么优点?为什么选择Nginx做web服务器软件?(经典经典)
1.基础知识 代理服务器: 一般是指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端.应用比如:GoAgent,FQ神器. 一个完整的代理请求过程为:客 ...