题目描述

给定矩阵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


题解

矩阵乘法+Hash+BSGS

看到题目很容易想到BSGS算法,但要求逆元,而矩阵的逆不是很好求出,怎么办?

事实上,BSGS有两种形式:$a^{km+t}\equiv(mod\ p)$和$a^{km-t}\equiv b(mod\ p)$

第一种形式是经典的BSGS,并可以应用到EXBSGS中,而第二种形式的优点在于不需要求逆元,放到此题中就是不需要求矩阵的逆。

按照BSGS的思路,原题可化为$A^{km}\equiv B*A^t(mod\ p)$

于是我们便可以把$B*A^t(mod\ p)$存到map中,然后枚举k的取值来查询。

如何快速查询?就需要使用Hash。

这里为了防止两个不同矩阵的Hash值冲突,使用了两个底数进行Hash。

然后就可以愉快的套BSGS的板子了~

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <map>
  5. #include <utility>
  6. #define N 75
  7. using namespace std;
  8. typedef unsigned long long ull;
  9. const ull base1 = 100003 , base2 = 1000003;
  10. int n , p;
  11. struct data
  12. {
  13. ull v[N][N] , val1 , val2;
  14. data(int x)
  15. {
  16. int i;
  17. memset(v , 0 , sizeof(v)) , val1 = val2 = 0;
  18. for(i = 1 ; i <= n ; i ++ ) v[i][i] = x;
  19. }
  20. data operator*(const data a)const
  21. {
  22. int i , j , k;
  23. data ans(0);
  24. for(i = 1 ; i <= n ; i ++ )
  25. for(j = 1 ; j <= n ; j ++ )
  26. for(k = 1 ; k <= n ; k ++ )
  27. ans.v[i][j] = (ans.v[i][j] + v[i][k] * a.v[k][j]) % p;
  28. return ans;
  29. }
  30. void hash()
  31. {
  32. int i , j;
  33. for(i = 1 ; i <= n ; i ++ )
  34. for(j = 1 ; j <= n ; j ++ )
  35. val1 = val1 * base1 + v[i][j] , val2 = val2 * base2 + v[i][j];
  36. }
  37. };
  38. map<pair<ull , ull> , int> f;
  39. map<pair<ull , ull> , int>::iterator it;
  40. int main()
  41. {
  42. int i , j , k , m;
  43. scanf("%d%d" , &n , &p) , m = (int)ceil(sqrt(p));
  44. data A(0) , B(0) , C(1) , D(1);
  45. for(i = 1 ; i <= n ; i ++ ) for(j = 1 ; j <= n ; j ++ ) scanf("%llu" , &A.v[i][j]);
  46. for(i = 1 ; i <= n ; i ++ ) for(j = 1 ; j <= n ; j ++ ) scanf("%llu" , &B.v[i][j]);
  47. for(i = 1 ; i <= m ; i ++ ) B = B * A , B.hash() , f[make_pair(B.val1 , B.val2)] = i;
  48. for(i = 1 ; i <= m ; i ++ ) C = C * A;
  49. for(i = 1 ; i <= m ; i ++ )
  50. {
  51. D = D * C , D.hash() , it = f.find(make_pair(D.val1 , D.val2));
  52. if(it != f.end())
  53. {
  54. printf("%d\n" , i * m - it->second);
  55. return 0;
  56. }
  57. }
  58. return 0;
  59. }

【bzoj4128】Matrix 矩阵乘法+Hash+BSGS的更多相关文章

  1. bzoj4128 Matrix 矩阵 BSGS

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

  2. UVA 11149 - Power of Matrix(矩阵乘法)

    UVA 11149 - Power of Matrix 题目链接 题意:给定一个n*n的矩阵A和k,求∑kiAi 思路:利用倍增去搞.∑kiAi=(1+Ak/2)∑k/2iAi,不断二分就可以 代码: ...

  3. BZOJ4128 Matrix 【BSGS】

    BZOJ4128 Matrix Description 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) Input 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * ...

  4. Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法

    我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...

  5. hdu4920 Matrix multiplication 模3矩阵乘法

    hdu4920 Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 ...

  6. BZOJ_4128_Matrix_矩阵乘法+哈希+BSGS

    BZOJ_4128_Matrix_矩阵乘法+哈希+BSGS Description 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) Input 第一行两个整数n和p,表示矩阵的 ...

  7. HDU4965 Fast Matrix Calculation —— 矩阵乘法、快速幂

    题目链接:https://vjudge.net/problem/HDU-4965 Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Othe ...

  8. Poj 3233 Matrix Power Series(矩阵乘法)

    Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Description Given a n × n matrix A and ...

  9. POJ3233 [C - Matrix Power Series] 矩阵乘法

    解题思路 题目里要求\(\sum_{i=1}^kA^i\),我们不妨再加上一个单位矩阵,求\(\sum_{i=0}^kA^i\).然后我们发现这个式子可以写成这样的形式:\(A(A(A...)+E)+ ...

随机推荐

  1. HTML5中的webSocket、ajax、http

    本文原链接:https://cloud.tencent.com/developer/article/1115496 https://cloud.tencent.com/developer/articl ...

  2. Linux增加sudo用户

    1.  root用户编辑文件/etc/sudoers vi /etc/sudoers 2.  按yy复制行root   ALL=(ALL)      ALL 按p粘贴,修改 “root” 为添加的用户 ...

  3. linux基本命令及使用方法

    shell环境: shell:命令解释器,是Linux 系统的用户界面,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行. bash:是GNU 计划中重要的工具软件之一 ...

  4. c3p0,dbcp和proxool

    关于c3p0.dbcp和proxool,之类的比较,配置在网上有很多的文章,我这边就不浪费大家的时间了,主要讲下我用过这三个之后的体会. dbcp:框架以前使用的是dbcp,网上说,有很多BUG,至少 ...

  5. iOS中的数据存储方式_Plist

    plist文件只能存储OC常用数据类型(NSString.NSDictionary.NSArray.NSData.NSNumber等类型)而不能直接存储自定义模型对象; 我们拿NSData举例: /* ...

  6. 【转】C++后台开发应该读的书

    转载自http://www.cnblogs.com/balloonwj/articles/9094905.html 作者 左雪菲 根据我的经验来谈一谈,先介绍一下我的情况,坐标上海,后台开发(也带团队 ...

  7. C++ 学习笔记(二) const的加强

    const 含义为只读.如果在程序中显式改变const变量那么编译会报错. C语言的const: 在C语言中const 变量是放在内存中,如果使用指针可以间接改变const变量.所以在C语言中cons ...

  8. 关于bc中小数点length,scale,(())以及进制转换

    这是我在codewar上遇到的一个题,我用我自己的方法做出了解答,如下: 1 #!/bin/bash 2 3 distance=`echo "$1*10000"|bc|cut -d ...

  9. 转 WebService两种发布协议--SOAP和REST的区别

    转发文章 https://blog.csdn.net/zl834205311/article/details/62231545?ABstrategy=codes_snippets_optimize_v ...

  10. 有关git clone 下载速度变慢的解决方法

    使用提示:请注意一下,以下方法是在搭有梯子的情况下进行的,也就是说在有梯子的情况下,下载速度始终很慢,使用了以下方法用梯子下载达到正常速度,并没有尝试修复过后不用梯子下载. 所以,如果使用了以下方法, ...