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】的更多相关文章

  1. 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 ...

  2. BZOJ2242 [SDOI2011]计算器 【BSGS】

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4741  Solved: 1796 [Submit][Sta ...

  3. Codeforces1106F 【BSGS】【矩阵快速幂】【exgcd】

    首先矩阵快速幂可以算出来第k项的指数,然后可以利用原根的性质,用bsgs和exgcd把答案解出来 #include<bits/stdc++.h> using namespace std; ...

  4. bzoj4128 Matrix 矩阵 BSGS

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4128 题解 想了十分钟没有任何思路. 然后一眼瞥见一句话"数据保证在 \(p\) 内 ...

  5. Search a 2D Matrix【python】

    class Solution: # @param matrix, a list of lists of integers # @param target, an integer # @return a ...

  6. 【BSGS】BZOJ3239 Discrete Logging

    3239: Discrete Logging Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 729  Solved: 485[Submit][Statu ...

  7. POJ2417 Discrete Logging【BSGS】(模板题)

    <题目链接> 题目大意: P是素数,然后分别给你P,B,N三个数,然你求出满足这个式子的L的最小值 : BL== N (mod P). 解题分析: 这题是bsgs算法的模板题. #incl ...

  8. 牛客网多校赛第九场A-circulant matrix【数论】

    链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  9. BZOJ5296 CQOI2018 破解D-H协议 【BSGS】

    BZOJ5296 CQOI2018Day1T1 破解D-H协议 Description Diffie-Hellman密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码) ...

随机推荐

  1. jmeter随笔

    1. ${__time(yyyy-MM-dd HH:mm:ss,)} 2. import use.GetRsaContent; String pfxPath = "pfx";Str ...

  2. imagemagick在windows下安装(转,有改动)

    原文地址:http://blog.csdn.net/royal_coffee/article/details/1602933 注意:本補述僅提供 Windows 下安裝建議. 1. 到 http:// ...

  3. codeforces242E XOR on Segment

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. 12 Essential Bootstrap Tools for Web Designers

    12 Essential Bootstrap Tools for Web Designers Posted by vikas on June 6, 2014, filed in: Tools, Web ...

  5. 【转】ext4+delalloc造成单次写延迟增加的分析

    转自 http://blog.tao.ma/?p=58 这篇文章是淘宝内核组的刘峥同学在内部技术论坛上发表的一篇文章,但是由于刘峥同学目前没有blog,征得本人同意,贴在我的blog上,如果大家喜欢, ...

  6. jquery下跨域请求之代码示例

    场景描述: 在域A下异步获取B域下的接口: 实现方法: $.ajax({ url : (Q.lottery.serverTimeUrl || 'about:blank'), error : funct ...

  7. .NET中使用Redis:http://www.cnblogs.com/yangecnu/p/Introduct-Redis-in-DotNET.html

    .NET中使用Redis   Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http: ...

  8. C# 处理 JSON 常用的帮助类

    C#请求接口的方法,具体代码: 首先需要添加引用和第三方的组件,具体如下: 引用命名空间: using System.IO; using Newtonsoft.Json.Linq; using Sys ...

  9. PHP实现登录功能DEMO

    PHP实现登录的原理是什么呢?就是利用Session实现的,用户访问网站,系统会自动在服务器生成一个Session文件,这个Session可以用来存储用户的登录信息.好了,这是基本储备,我们下面来实现 ...

  10. LVS模式三:NAT模式

    一.NAT模式     NAT(Network Address Translation,网络地址转换).数据包传输过程就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地 ...