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密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码) ...
随机推荐
- JavaScript高级程序设计-读书笔记(7)
第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...
- i++为什么是线程不安全的
主要是因为i++这个操作不是原子性的,它会编译成 i = i +1: 其实是做了3个步骤,一个是读取,修改,写入 .所以会出现多线程访问冲突问题. 可以结合Java内存模型来进行说明.
- MySQL表类型MyISAM/InnoDB的区别(解决事务不回滚的问题)
MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...
- Ubuntu下配置Nginx+PHP
1.安装Nginxapt-get install nginx 2.启动Nginxservice nginx start 3.访问服务器IP 如果看到“Welcome to nginx!”说明安装好了. ...
- 阅读《大型网站技术架构:核心原理与案例分析》第五、六、七章,结合《XXX重大技术需求征集系统》,列举实例分析采用的可用性和可修改性战术,将上述内容撰写成一篇1500字左右的博客阐述你的观点。
这三章主要讲述的是网站的可用性.伸缩性和可扩展性. 首先,网站的可用性描述网站可有效访问的特性,相比于网站的其他非功能特性,网站的可用性更容易引起人们的注意,尤其是大型网站的可用性,如果大公司的网站出 ...
- 外层页面与iframe相互调用的方法
iframe调用外层页面的方法: parent.func(); 外层页面调用里面的iframe中的内容方法: $("iframe").contents().find(" ...
- IOS UI-键盘处理和UIToolbar
// // ViewController.m // IOS_0225-键盘处理和UIToolBar // // Created by ma c on 16/2/25. // Copyright © 2 ...
- Symmetrical Network Acceleration with EBS 12
Andy Tremayne, my esteemed colleague and fellow blogger, has published a new whitepaper that discuss ...
- JS种正则表达式的基础用法
基础语法 元字符 常用元字符 含义 . 匹配除换行符以外的任意字符 \w 匹配字母数字或下划线 \W 匹配不是字母.数字.下划线的字符 \d 匹配数字,相当于[0-9] \D 匹配不是数字的字符 \s ...
- vs 2013远程调试
1. 找到本机Remote Debugger/x64文件夹,将其拷贝到远程机器上 2.运行x64文件夹下的msvsmon.exe,将其设置为“无身份验证模式”,记住端口号,一会儿要用到 3.在vs中打 ...