【BZOJ4128】Matrix BSGS+hash
【BZOJ4128】Matrix
Description
给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p)
Input
Output
Sample Input
1 1
1 0
5 3
3 2
Sample Output
HINT
题解:网上看到好多求矩阵的逆的,一定是BSGS的姿势不对吧~
在BSGS时令x=i*m-j,就变成了$A^{i\times m}=BA^{j} (mod\ p)$,然后将矩阵hash一下扔到map里就行啦~
#include <cstdio>
#include <iostream>
#include <cstring>
#include <map>
#include <cmath>
using namespace std;
typedef unsigned long long ull;
int n,m,p;
ull s1[80],s2[80];
map<ull,int> mp;
struct M
{
int v[80][80];
ull hs;
M (){memset(v,0,sizeof(v)),hs=0;}
ull hash()
{
if(hs) return hs;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) hs+=s1[i-1]*s2[j-1]*v[i][j];
return hs;
}
M operator * (M a) const
{
M b;
int i,j,k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
b.v[i][j]=(b.v[i][j]+v[i][k]*a.v[k][j])%p;
return b;
}
};
M I,A,B,x,y;
int main()
{
scanf("%d%d",&n,&p);
int i,j;
for(s1[0]=s2[0]=1,i=1;i<=n;i++) s1[i]=s1[i-1]*233,s2[i]=s2[i-1]*2333;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&A.v[i][j]),I.v[i][j]=(i==j);
for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&B.v[i][j]);
x=y=I,mp[x.hash()]=0;
m=ceil(sqrt((double)p));
for(i=1;i<=m;i++) x=x*A,mp[(B*x).hash()]=i;
for(i=1;i<=m;i++)
{
y=y*x;
if(mp.find(y.hash())!=mp.end())
{
printf("%d",i*m-mp[y.hash()]);
return 0;
}
}
}
【BZOJ4128】Matrix BSGS+hash的更多相关文章
- 【bzoj4128】Matrix 矩阵乘法+Hash+BSGS
题目描述 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) 输入 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * n的矩阵A.接下来一个n * n的矩阵B 输出 输出 ...
- 【UVA11019】Matrix Matcher
Description Given an N × M matrix, your task is to find the number of occurences of an X × Y pattern ...
- 【RS】Matrix Factorization Techniques for Recommender Systems - 推荐系统的矩阵分解技术
[论文标题]Matrix Factorization Techniques for Recommender Systems(2009,Published by the IEEE Computer So ...
- 【poj2155】Matrix(二维树状数组区间更新+单点查询)
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
- 【BZOJ1125】[POI2008]Poc hash+map+SBT
[BZOJ1125][POI2008]Poc Description n列火车,每条有l节车厢.每节车厢有一种颜色(用小写字母表示).有m次车厢交换操作.求:对于每列火车,在交换车厢的某个时刻,与其颜 ...
- 【BZOJ2081】[Poi2010]Beads hash+调和级数
[BZOJ2081][Poi2010]Beads Description Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串), ...
- 【POJ3243】拓展BSGS(附hash版)
上一篇博文中说道了baby step giant step的方法(简称BSGS),不过对于XY mod Z = K ,若x和z并不互质,则不能直接套用BSGS的方法了. 为什么?因为这时候不存在逆元了 ...
- 【BZOJ 2351】Matrix(Hash)
题目链接 二维\(Hash\)类似二维前缀和,每一行看成一个\(h\)进制数,每一个以(1,1)为左上角的矩阵看成一个由每一行的\(Hash\)值组成的\(l\)进制数. 然后自己推推柿子就行. #i ...
- 【题解】Matrix BZOJ 4128 矩阵求逆 离散对数 大步小步算法
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 大水题一道 使用大步小步算法,把数字的运算换成矩阵的运算就好了 矩阵求逆?这么基础的线 ...
随机推荐
- case...when...简单用法sql说明
1.项目用到的sql展示 select n.name,n.position, case when ( then '有' else '无' end PUNISHMENT, case when ( the ...
- JS方面重点摘要(一)
1.获取样式(1)style只能获取到行间样式的属性(2)火狐getComputedStyle(obj,null)[attr],IE:obj.currentStyle[attr] 2.ready.on ...
- Uncaught SyntaxError: Invalid Unicode escape sequence异常处理
今天碰到一个问题,页面报错:Uncaught SyntaxError: Invalid Unicode escape sequence ,{index:'operate',name:'operate' ...
- Hadoop之Flume详解
1.日志采集框架Flume 1.1 Flume介绍 Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. Flume可以采集文件,socket数据包等各种形式源数据,又可以将采集到 ...
- CentOS 7.2通过yum安装zabbix
环境说明 系统版本 CentOS 7.2 x86_64 软件版本 yum安装zabbix 3.0.18 首先准备一台纯净的CentOS 7.2系统 1.配置zabbix源 [root@za ...
- 利用eolinker实现api接口mock测试(mock server)
转载:http://blog.csdn.net/naicha_qin/article/details/78276172 前后端分离或者是进行单元测试的时候,必须要用mock api替换掉第三方调用或者 ...
- Linux中MySQL数据库max_allowed_packet的调整
在MySQL数据库里某表有一个blob字段,当上传文件超过1M的时候出现下面的错误: PreparedStatementCallback; SQL [insert into uos.docfile(r ...
- 倍福TwinCAT(贝福Beckhoff)基础教程4.1 TwinCAT如何读写TXT文件
TwinCAT提供了FB_FileRead等一系列读写文件的方法,本小程序演示的是多个贝福自带的FBD功能块连起来用的方法,跟前面讲的一样,建议在初始化的时候把所有FBD都复位,准备使用 真正的读 ...
- 迭代器适配器(一)back_inserter和front_inserter的实现
本文讨论back_inserter和front_inserter的实现. 当我们调用copy函数的时候,要确保目标容器具有足够大的空间,例如: //将other的所有元素拷贝到以coll.begin( ...
- 字典树-HDOJ-1247-Hat’s Words
Hat's Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...