BZOJ4128 Matrix 【BSGS】
BZOJ4128 Matrix
Description
给定矩阵A,B和模数p,求最小的x满足
A^x = B (mod p)
Input
第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * n的矩阵A.接下来一个n * n的矩阵B
Output
输出一个正整数,表示最小的可能的x,数据保证在p内有解
Sample Input
2 7
1 1
1 0
5 3
3 2
Sample Output
4
HINT
对于100%的数据,n <= 70,p <=19997,p为质数,0<= A_{ij},B_{ij}< p
保证A有逆
一看就是BSGS嘛
别人出题人都保证了矩阵有逆你还在犹豫什么呢
Guass消元求逆
大概就是拿一个单位矩阵出来,原矩阵该怎么消怎么消,单位矩阵跟着原矩阵一起操作就行了
感觉非常简单
然后我居然非常傻逼地忽略了题目中已给的模数自己定义了一个模数
阿弥陀佛
#include<bits/stdc++.h>
using namespace std;
#define N 80
#define P 20000
#define M 37373
int n,p;
struct Matrix{
int t[80][80];
Matrix(){memset(t,0,sizeof(t));}
};
struct Edge{
int v,next,val;
Edge(){}
Edge(int v,int next,int val):v(v),next(next),val(val){}
}E[M+2];
int head[M+2],tot=0;
void add(int u,int v,int val){
E[++tot]=Edge(v,head[u],val);
head[u]=tot;
}
int query(int Hash_value){
for(int i=head[Hash_value%M];i!=-1;i=E[i].next)
if(E[i].val==Hash_value)return E[i].v;
return -1;
}
int add(int a,int b){return (a+b)%p;}
int dec(int a,int b){return (a-b+p)%p;}
int mul(int a,int b){return 1ll*a*b%p;}
Matrix mul(Matrix a,Matrix b){
Matrix c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
c.t[i][j]=add(c.t[i][j],mul(a.t[i][k],b.t[k][j]));
return c;
}
int fast_pow(int a,int b){
int res=1;
while(b){
if(b&1)res=mul(res,a);
b>>=1;
a=mul(a,a);
}
return res;
}
Matrix inv_Matrix(Matrix a){
Matrix res;
for(int i=1;i<=n;i++)res.t[i][i]=1;
for(int i=1;i<=n;i++){
int k=0;
for(int j=i;j<=n;j++)if(a.t[j][i]){k=j;break;}
for(int j=1;j<=n;j++){
swap(a.t[i][j],a.t[k][j]);
swap(res.t[i][j],res.t[k][j]);
}
int inv=fast_pow(a.t[i][i],p-2);
for(int j=1;j<=n;j++){
a.t[i][j]=mul(a.t[i][j],inv);
res.t[i][j]=mul(res.t[i][j],inv);
}
for(int j=1;j<=n;j++){
if(i==j)continue;
int pre=a.t[j][i];
for(int w=1;w<=n;w++){
a.t[j][w]=dec(a.t[j][w],mul(pre,a.t[i][w]));
res.t[j][w]=dec(res.t[j][w],mul(pre,res.t[i][w]));
}
}
}
return res;
}
int Hash(Matrix a){return a.t[n][n];}
int BSGS(Matrix A,Matrix B,int c){
int siz=sqrt(c)+1;
Matrix tmp;
for(int i=1;i<=n;i++)tmp.t[i][i]=1;
for(int i=0;i<siz;i++){
int Hash_value=Hash(tmp);
if(query(Hash_value)==-1)add(Hash_value%M,i,Hash_value);
tmp=mul(tmp,A);
}
Matrix inv_matrix=inv_Matrix(tmp);
for(int i=0;i<=siz;i++){
int Hash_value=Hash(B);
int tip=query(Hash_value);
if(tip!=-1)return tip+i*siz;
B=mul(B,inv_matrix);
}
return -1;
}
int main(){
freopen("4128.in","r",stdin);
memset(head,-1,sizeof(head));
Matrix A,B;
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)scanf("%d",&A.t[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)scanf("%d",&B.t[i][j]);
printf("%d\n",BSGS(A,B,p));
return 0;
}
BZOJ4128 Matrix 【BSGS】的更多相关文章
- 28. Search a 2D Matrix 【easy】
28. Search a 2D Matrix [easy] Write an efficient algorithm that searches for a value in an mx n matr ...
- BZOJ2242 [SDOI2011]计算器 【BSGS】
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 4741 Solved: 1796 [Submit][Sta ...
- Codeforces1106F 【BSGS】【矩阵快速幂】【exgcd】
首先矩阵快速幂可以算出来第k项的指数,然后可以利用原根的性质,用bsgs和exgcd把答案解出来 #include<bits/stdc++.h> using namespace std; ...
- bzoj4128 Matrix 矩阵 BSGS
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4128 题解 想了十分钟没有任何思路. 然后一眼瞥见一句话"数据保证在 \(p\) 内 ...
- Search a 2D Matrix【python】
class Solution: # @param matrix, a list of lists of integers # @param target, an integer # @return a ...
- 【BSGS】BZOJ3239 Discrete Logging
3239: Discrete Logging Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 729 Solved: 485[Submit][Statu ...
- POJ2417 Discrete Logging【BSGS】(模板题)
<题目链接> 题目大意: P是素数,然后分别给你P,B,N三个数,然你求出满足这个式子的L的最小值 : BL== N (mod P). 解题分析: 这题是bsgs算法的模板题. #incl ...
- 牛客网多校赛第九场A-circulant matrix【数论】
链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- BZOJ5296 CQOI2018 破解D-H协议 【BSGS】
BZOJ5296 CQOI2018Day1T1 破解D-H协议 Description Diffie-Hellman密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码) ...
随机推荐
- gem doorkeeper(4000✨) ,Go-rails视频
博客OAuth教程:https://i.cnblogs.com/EditPosts.aspx?postid=9531091 doorkeeper: (4000
- 【转载】deque双向队列
继vector和queue之后,又发现一个很好用的东西. 本篇转载自http://blog.csdn.net/morewindows/article/details/6946811 deque双向队列 ...
- HDU 2795 线段树单点更新
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Linux IPv6 地址配置
添加IPV6地址ip -6 addr add <ipv6address>/<prefixlength> dev <interface>ip -6 addr add ...
- 移动端点击(click)事件延迟问题的产生与解决方法
http://blog.csdn.net/xjun0812/article/details/64919063 问题的发现 上班做项目的时候碰到一个移动端项目,其中有个小游戏,相当于天上掉馅饼,用户需要 ...
- Java进阶7 并发优化2 并行程序设计模式
Java进阶7 并发优化2 并行程序设计模式20131114 1.Master-worker模式 前面讲解了Future模式,并且使用了简单的FutureTask来实现并发中的Future模式.下面介 ...
- java程序设计基础篇 复习笔记 第一单元
java语言程序设计基础篇笔记1. 几种有名的语言COBOL:商业应用FORTRAN:数学运算BASIC:易学易用Visual Basic,Delphi:图形用户界面C:汇编语言的强大功能和易学性,可 ...
- Prism 4 文档 ---第3章 管理组件间的依赖关系
基于Prism类库的应用程序可能是由多个松耦合的类型和服务组成的复杂应用程序,他们需要根据用户的动作发出内容和接收通知进行互动,由于他们是松耦合的,他们需要一种方式来互动和交流来传递业务功能的需求. ...
- LeetCode OJ:Isomorphic Strings(同构字符串)
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
- 《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...