题目描述

给定矩阵A,B和模数p,求最小的x满足

A^x = B (mod p)

输入

第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * n的矩阵A.接下来一个n * n的矩阵B

输出

输出一个正整数,表示最小的可能的x,数据保证在p内有解

样例输入

2 7
1 1
1 0
5 3
3 2

样例输出

4

提示

对于100%的数据,n <= 70,p <=19997,p为质数,0<= A_{ij},B_{ij}< p
保证A有逆
 
 
发现式子的形式可以$BSGS$,但唯一不同的就是把数换成了矩阵。我们知道,正常的$BSGS$有两种形式:$a^{i*m+j}\equiv b(mod\ p)$和$a^{i*m-j}\equiv b(mod\ p)$。第一种形式需要求逆,而第二种不需要。那么我们可以用第二种方法来求以避免矩阵求逆。至于如何快速判两个矩阵相同可以使用$hash$来判,为了防止被卡建议使用两个$base$。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define pr pair<ull,ull>
using namespace std;
int base1=10007;
int base2=233;
int n,p,m;
map<pr,int>mp;
struct lty
{
ull v[80][80],val1,val2;
lty(int x)
{
memset(v,0,sizeof(v));
val1=val2=0;
for(int i=1;i<=n;i++)
{
v[i][i]=x;
}
}
lty operator *(lty a)
{
lty ans(0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int 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()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
val1=val1*base1+v[i][j];
val2=val2*base2+v[i][j];
}
}
}
};
int main()
{
scanf("%d%d",&n,&p);
m=ceil(sqrt(p));
lty A(0),B(0),C(1),D(1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%llu",&A.v[i][j]);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%llu",&B.v[i][j]);
}
}
for(int i=1;i<=m;i++)
{
B=B*A;
B.hash();
mp[make_pair(B.val1,B.val2)]=i;
}
for(int i=1;i<=m;i++)
{
C=C*A;
}
for(int i=1;i<=m;i++)
{
D=D*C;
D.hash();
if(mp.find(make_pair(D.val1,D.val2))!=mp.end())
{
printf("%d",i*m-mp[make_pair(D.val1,D.val2)]);
return 0;
}
}
}

BZOJ4128Matrix——hash+矩阵乘法+BSGS的更多相关文章

  1. 【bzoj4128】Matrix 矩阵乘法+Hash+BSGS

    题目描述 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) 输入 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * n的矩阵A.接下来一个n * n的矩阵B 输出 输出 ...

  2. BZOJ_4128_Matrix_矩阵乘法+哈希+BSGS

    BZOJ_4128_Matrix_矩阵乘法+哈希+BSGS Description 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) Input 第一行两个整数n和p,表示矩阵的 ...

  3. Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法

    我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...

  4. BZOJ1297 [SCOI2009]迷路 矩阵乘法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1297 题意概括 有向图有 N 个节点,从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. ...

  5. ZOJ 3256 Tour in the Castle 插头DP 矩阵乘法

    题解 这题是一道非常好的插头题,与一般的按格转移的题目不同,由于m很大,要矩阵乘法,这题需要你做一个按列转移的插头DP. 按列转移多少与按格转移不同,但大体上还是基于连通性进行转移.每一列只有右插头是 ...

  6. poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7825   Accepted: 3068 Descri ...

  7. 洛谷P2886 [USACO07NOV]Cow Relays G (矩阵乘法与路径问题)

    本题就是求两点间只经过n条边的最短路径,定义广义的矩阵乘法,就是把普通的矩阵乘法从求和改成了取最小值,把内部相乘改成了相加. 代码包含三个内容:广义矩阵乘法,矩阵快速幂,离散化: 1 #include ...

  8. *HDU2254 矩阵乘法

    奥运 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  9. *HDU 1757 矩阵乘法

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

随机推荐

  1. JasperReport制作行内容合并的表格

    效果图: 实现思路一: 交叉表 另一个思路: 普通表格 缺点:无法实现内容 垂直居中显示 准备工作 一.数据准备 DROP TABLE IF EXISTS `address_item_sex_valu ...

  2. A2D JS框架 - loadScript实现

    其实这个功能比较小,本着自己造轮子的优良传统....就自己造一个好了 <head> <title></title> <script src="A2D ...

  3. ML.NET 示例:推荐之场感知分解机

    写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...

  4. 扒一扒: Java 中的枚举

    目录 1. 枚举的定义 1.1 传统的非枚举方法 1.2 枚举方法 1.3 定义总结 2 枚举的本质 2.1 继承 java.lang.Enum 2.2 final 类型 2.3 枚举常量本身就是该类 ...

  5. git revert 还有这个坑?

    最近也是终于开启了代码编写之旅,我只能默默地说一句,写代码的感觉,简直不能再爽! 不过也由于 git 的分支管理蛋疼懵逼很久,所以必须记录以及和大家分享一下本次坑爹的旅行. 写在前面 每个公司相比都有 ...

  6. 前后端分离的利器:fiddler的实用功能举例

    # 前后端分离的利器:fiddler的实用功能举例 ##what's fiddler fiddler是一款代理软件,对于前后端分离开发非常重要.可以说,如果前端开发没有用上fiddler或类似软件,那 ...

  7. 朱晔的互联网架构实践心得S1E5:不断耕耘的基础中间件

    朱晔的互联网架构实践心得S1E5:不断耕耘的基础中间件 [下载本文PDF进行阅读] 一般而言中间件和框架的区别是,中间件是独立运行的用于处理某项专门业务的CS程序,会有配套的客户端和服务端,框架虽然也 ...

  8. prometeus, grafana部署以及监控mysql

    什么是普罗米修斯? Prometheus是一个最初在SoundCloud上构建的开源系统监视和警报工具包 .自2012年成立以来,许多公司和组织都采用了Prometheus,该项目拥有一个非常活跃的开 ...

  9. Heroku + Node.js + HTTPS

    昨天把 biz-to-me 升级到支持 HTTPS 了,为此研究了一下如何让 Heroku 上跑的 Node.js 应用支持 HTTPS.我发现并没有任何文章描述这个具体的流程,只有零碎的信息,所以在 ...

  10. 杭电 1061 Rightmost Digit计算N^N次方的最后一位

    Problem Description Given a positive integer N, you should output the most right digit of N^N. Input ...