【bzoj4128】Matrix 矩阵乘法+Hash+BSGS
题目描述
给定矩阵A,B和模数p,求最小的x满足
A^x = B (mod p)
输入
输出
样例输入
2 7
1 1
1 0
5 3
3 2
样例输出
4
题解
矩阵乘法+Hash+BSGS
看到题目很容易想到BSGS算法,但要求逆元,而矩阵的逆不是很好求出,怎么办?
事实上,BSGS有两种形式:$a^{km+t}\equiv(mod\ p)$和$a^{km-t}\equiv b(mod\ p)$
第一种形式是经典的BSGS,并可以应用到EXBSGS中,而第二种形式的优点在于不需要求逆元,放到此题中就是不需要求矩阵的逆。
按照BSGS的思路,原题可化为$A^{km}\equiv B*A^t(mod\ p)$
于是我们便可以把$B*A^t(mod\ p)$存到map中,然后枚举k的取值来查询。
如何快速查询?就需要使用Hash。
这里为了防止两个不同矩阵的Hash值冲突,使用了两个底数进行Hash。
然后就可以愉快的套BSGS的板子了~
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <utility>
#define N 75
using namespace std;
typedef unsigned long long ull;
const ull base1 = 100003 , base2 = 1000003;
int n , p;
struct data
{
ull v[N][N] , val1 , val2;
data(int x)
{
int i;
memset(v , 0 , sizeof(v)) , val1 = val2 = 0;
for(i = 1 ; i <= n ; i ++ ) v[i][i] = x;
}
data operator*(const data a)const
{
int i , j , k;
data ans(0);
for(i = 1 ; i <= n ; i ++ )
for(j = 1 ; j <= n ; j ++ )
for(k = 1 ; k <= n ; k ++ )
ans.v[i][j] = (ans.v[i][j] + v[i][k] * a.v[k][j]) % p;
return ans;
}
void hash()
{
int i , j;
for(i = 1 ; i <= n ; i ++ )
for(j = 1 ; j <= n ; j ++ )
val1 = val1 * base1 + v[i][j] , val2 = val2 * base2 + v[i][j];
}
};
map<pair<ull , ull> , int> f;
map<pair<ull , ull> , int>::iterator it;
int main()
{
int i , j , k , m;
scanf("%d%d" , &n , &p) , m = (int)ceil(sqrt(p));
data A(0) , B(0) , C(1) , D(1);
for(i = 1 ; i <= n ; i ++ ) for(j = 1 ; j <= n ; j ++ ) scanf("%llu" , &A.v[i][j]);
for(i = 1 ; i <= n ; i ++ ) for(j = 1 ; j <= n ; j ++ ) scanf("%llu" , &B.v[i][j]);
for(i = 1 ; i <= m ; i ++ ) B = B * A , B.hash() , f[make_pair(B.val1 , B.val2)] = i;
for(i = 1 ; i <= m ; i ++ ) C = C * A;
for(i = 1 ; i <= m ; i ++ )
{
D = D * C , D.hash() , it = f.find(make_pair(D.val1 , D.val2));
if(it != f.end())
{
printf("%d\n" , i * m - it->second);
return 0;
}
}
return 0;
}
【bzoj4128】Matrix 矩阵乘法+Hash+BSGS的更多相关文章
- bzoj4128 Matrix 矩阵 BSGS
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4128 题解 想了十分钟没有任何思路. 然后一眼瞥见一句话"数据保证在 \(p\) 内 ...
- UVA 11149 - Power of Matrix(矩阵乘法)
UVA 11149 - Power of Matrix 题目链接 题意:给定一个n*n的矩阵A和k,求∑kiAi 思路:利用倍增去搞.∑kiAi=(1+Ak/2)∑k/2iAi,不断二分就可以 代码: ...
- BZOJ4128 Matrix 【BSGS】
BZOJ4128 Matrix Description 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) Input 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法
我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...
- hdu4920 Matrix multiplication 模3矩阵乘法
hdu4920 Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 ...
- BZOJ_4128_Matrix_矩阵乘法+哈希+BSGS
BZOJ_4128_Matrix_矩阵乘法+哈希+BSGS Description 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) Input 第一行两个整数n和p,表示矩阵的 ...
- HDU4965 Fast Matrix Calculation —— 矩阵乘法、快速幂
题目链接:https://vjudge.net/problem/HDU-4965 Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Othe ...
- Poj 3233 Matrix Power Series(矩阵乘法)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Description Given a n × n matrix A and ...
- POJ3233 [C - Matrix Power Series] 矩阵乘法
解题思路 题目里要求\(\sum_{i=1}^kA^i\),我们不妨再加上一个单位矩阵,求\(\sum_{i=0}^kA^i\).然后我们发现这个式子可以写成这样的形式:\(A(A(A...)+E)+ ...
随机推荐
- 使用Timer组件制作计时器
实现效果: 知识运用: Timer组件的interval属性 //获取或设置Timer组件Tick事件发生的时间间隔 public int Interval {get;set} NumericUpDo ...
- WINDOWS-基础:SafeArray的使用方法
1 SafeArray的作用 使用SafeArray SafeArray是VB中的数组存储方式.通过SafeArray,可以在VC++和VB间相互调用. SafeArray也是Automation中的 ...
- 数据库连接池 dbcp与c3p0的使用区别
众所周知,无论现在是B/S或者是C/S应用中,都免不了要和数据库打交道.在与数据库交 互过程中,往往需要大量的连接.对于一个大型应用来说,往往需要应对数以千万级的用户连接请求,如果高效相应用户请求,对 ...
- Web前端 优化方案
1.减少Http请求 在一个页面中图片,CSS,JS可能N个,如果每个资源都去请求一次服务器的话,那么服务器就会为每个资源开一个线程来完成,这样的话对服务器的压力就很大了.所以解决的方法就是合并资源 ...
- 源自http://www.cnblogs.com/sciencefans/p/4394861.html
人脸识别的四大块:Face detection, alignment, verification and identification(recognization),本别代表从一张图中识别出人脸位置, ...
- CF-1093 (2019/02/10)
CF-1093 1093A - Dice Rolling 输出x/2即可 #include<bits/stdc++.h> using namespace std; int main() { ...
- STL 之 sort 函数使用方法
关于Sort Sort函数是C++ STL(Standard Template Library / 标准函数库) <algorithm>头文件中的一个排序函数,作用是将一系列数进行排序,因 ...
- [LUOGU]P1508 Likecloud-吃、吃、吃
题目背景 问世间,青春期为何物? 答曰:"甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!" 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日 ...
- tomcat关闭钩子
转 http://501565246-qq-com.iteye.com/blog/1733575 21,tomcat关闭钩子 博客分类: tomcat 在很多环境下,在关闭应用程序的时候需要做一些 ...
- python入门:if、elif、else 条件语句的基本用法
#!/usr/bin/env python # -*- coding:utf-8 -*- #elif(否则如果,译音:埃尔夫)eise(否则,译音:埃尔斯) #if.elif.else 条件语句的基本 ...