【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)+ ...
随机推荐
- GetOpenFileName 选择文件夹的解决方法
某些环境下(如WIN PE)windows自带的选择文件夹api不能使用或者体验不佳.现在利用GetOpenFileName的回掉参数实现了选择文件夹选择功能. #include <Window ...
- Codeforces 666E Forensic Examination SAM or SA+线段树合并
E. Forensic Examination http://codeforces.com/problemset/problem/666/E 题目大意:给模式串S以及m个特殊串,q个询问,询问S的子串 ...
- Spoj REPEATS 后缀自动机+set
REPEATS - Repeats 链接:http://www.spoj.com/problems/REPEATS 题意:求S串中某个子串连续循环次数最多的次数. 想法: 从暴力开始,枚举所有串,求出 ...
- [dp uestc oj] G - 邱老师玩游戏
G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- HTML5中的SSE(服务器推送技术)
本文原链接:https://cloud.tencent.com/developer/article/1194063 SSE技术详解:一种全新的HTML5服务器推送事件技术 前言 概述 基本介绍 与We ...
- ubuntu下安装eclipse<转>
转载自http://my.oschina.net/u/1407116/blog/227084 http://my.oschina.net/u/1407116/blog/227087 一 JD ...
- CentOS7-samba文件共享服务
简介: Samba,是在Unix上实现SMB(Server Message Block)的一个工具套件.而SMB通常是windows用来实现共享的,包括文件和打印机等.而Unix上装上SMB,则使得U ...
- python学习笔记-环境安装【1】
1.在 WINDOWS 下面要运行命令 pip install virtualenvwrapper-win才行 参考地址http://blog.csdn.net/liuhongyue/article/ ...
- scanf()的使用
scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中. 如下面代码: #include<stdio.h> int main() { int a,b; sca ...
- cocos2dx 3.x lua 网络加载并且保存资源(unix、linux)
#ifndef __DazzleParkour__TextLoader__ #define __DazzleParkour__TextLoader__ #include <stdio.h> ...