题目描述

给定矩阵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. MySQL常用SQL语句/函数/存储过程

    一句话总结 SELECT count(*) FROM user WHERE id>0 GROUP BY name HAVING count(*)>1 ORDER BY count(*)DE ...

  2. Plugin 'Lombok Plugin' is incompatible with this installation

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. Installation Error Plugin 'Lombok ...

  3. Centos 7安装RabbitMQ 3.7.8版本(单机版)-不使用RPM

    RabbitMQ是目前非常热门的消息中间件,凭借其高可靠.高扩展.高可用及丰富的功能特性:TTL.死信队列.延迟队列.优先级队列.消息持久化.镜像队列. 消息中间件是指利用高效可靠的消息传递机制进行与 ...

  4. 小记Java时间工具类

    小记Java时间工具类 废话不多说,这里主要记录以下几个工具 两个时间只差(Data) 获取时间的格式 格式化时间 返回String 两个时间只差(String) 获取两个时间之间的日期.月份.年份 ...

  5. 北京教育软件创业公司招 .net工程师

    北京教育软件创业公司,招 .net工程师,月工资2万左右,有合适的朋友帮忙推荐下,要求水平稍高一些的.产品目前用Winform开发的.创始人两个清华,一个北大.老板在美国待了七年回来的,爱人在清华教书 ...

  6. 腾讯内推一面C++

    北邮论坛找个腾讯的内推,没想到那么快就安排面试了.第一次面腾讯,写点东西记录一下吧. 面的是位置服务部门. 去了之后HR先给了两张纸,有三道编程题.第一道是求 二进制中1的个数(考察位运算)(剑指of ...

  7. Paypal2017实习生-软件开发-B卷

    1. [编程|15分] Calculate survival fishes时间限制:1秒空间限制:32768K题目描述Given two zero-indexed arrays A and B con ...

  8. hibernate中实体与数据库中属性对应的类型

    常用的字段及类型,在数据库中字段名称若与实体对应的属性字段名称相同,hibernate可以自动映射,在一些情况下hibernate可能报错这时候有的错误可以通过指定对应的类型避免.下面给出一些常用的 ...

  9. 提取PPT文件中的Vba ProjectStg Compressed Atom。Extract PPT VBA Compress Stream

    http://msdn.microsoft.com/en-us/library/cc313106(v=office.12).aspx  微软文档 PartI ********************* ...

  10. Vue使用的一些实例

    1.实现歌曲的点击切换. <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...