【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)+ ...
随机推荐
- 检查EXE、DLL、SYS等文件是32位还是64位的
非.NET文件用:dumpbin.exe /headers file.exe(C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin) . ...
- 如何在程序中加入Growl通知
Growl for Windows – Mac 样式的信息提示工具.目前已经支持的软件包括:Outlook,Visual Studio 等以及一个利用命令行从本地或者远程发送消息过来的工具 .Grow ...
- UVA 1606 Amphiphilic Carbon Molecules 两亲性分子 (极角排序或叉积,扫描法)
任意线可以贪心移动到两点上.直接枚举O(n^3),会TLE. 所以采取扫描法,选基准点,然后根据极角或者两两做叉积比较进行排排序,然后扫一遍就好了.旋转的时候在O(1)时间推出下一种情况,总复杂度为O ...
- js原型,原型链的理解
1.所有引用类型(函数.数组.对象)都拥有_proto_属性(隐式原型) 2.所有函数拥有prototype属性(显式原型)(仅限函数) 3.原型对象:拥有prototype属性的对象,在定义函数时就 ...
- 字符编码:Unicode和UTF-8的关系
今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚. 下面就是我的笔记,主要用来整理自己的思 ...
- JavaScript -- 条件语句和循环语句
if语句 在我们开发程序的时候,经常会遇到选择题,例如,年龄大于18,你就可以抽烟喝酒烫头,年龄小于18,你就只能吃饭喝水.在我们的代码中,我们可以用if语句来实现这种判断 语法一: if( cond ...
- linux 安装并且设置环境lua环境变量
在lua官网下载lua安装包并安装: http://www.lua.org/download.html 解压编译: wget http://www.lua.org/ftp/lua-5.3.2.tar. ...
- 【模板】有旋Treap
如题,这是一个模板... #include <algorithm> #include <iostream> #include <cstring> #include ...
- Win10家庭版找不到组策略gpedit.msc
首先在桌面上建立一个txt文本文件,将下面的代码复制到里面 @echo off pushd "%~dp0" dir /b C:\Windows\servicing\Packages ...
- ubuntu下RedisDesktopManager的安装,redis可视化工具
官方网站:https://redisdesktop.com/download 一句命令行解决: sudo snap install redis-desktop-manager 或者直接通过软件管理中心 ...