博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4128: Matrix(BSGS 矩阵乘法)
阅读量:7026 次
发布时间:2019-06-28

本文共 2173 字,大约阅读时间需要 7 分钟。

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 813  Solved: 442
[][][]

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有逆
 

Source

裸的BSGS,把$x$分解为$im - j$

原式化为$a^{im} \equiv ba^j \pmod p$

其中$m = \ceil{sqrt(p)}$

然后枚举一个$j$,存到map里

再枚举一个$i$判断即可

一开始map写成bool类型了调了半个小时

#include
#include
#include
#include
//#define LL long long using namespace std;const int MAXN = 4 * 1e5 + 10;inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') {
if(c == '-') f = -1; c = getchar();} while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f;}int N, mod, M;struct Matrix { int m[71][71]; Matrix operator * (const Matrix &rhs) const { Matrix ans = {}; for(int i = 1; i <= N; i++) for(int j = 1; j <= N; j++) for(int k = 1; k <= N; k++) (ans.m[i][j] += m[i][k] * rhs.m[k][j]) %= mod; return ans; } void init() { for(int i = 1; i <= N; i++) for(int j = 1; j <= N; j++) m[i][j] = read(); } void print() { for(int i = 1; i <= N; i++, puts("")) for(int j = 1; j <= N; j++) printf("%d ", m[i][j]); } bool operator < (const Matrix &rhs) const { for(int i = 1; i <= 70; i++) for(int j = 1; j <= 70; j++) { if(m[i][j] < rhs.m[i][j]) return 1; if(m[i][j] > rhs.m[i][j]) return 0; } return 0; }}A, B;map
mp;void MakeMap() { Matrix a = B; mp[a] = 0; for(int i = 1; i <= M; i++) a = a * A, mp[a] = i;}void FindAns() { Matrix a, am = A; for(int i = 1; i <= M - 1; i++) am = am * A; a = am; for(int i = 1; i <= M; i++) { if(mp[a]) printf("%d", i * M - mp[a]), exit(0); a = a * am; }}main() { N = read(); mod = read(); A.init(); B.init(); M = (double)ceil(sqrt(mod)); MakeMap(); FindAns();}

 

转载地址:http://booxl.baihongyu.com/

你可能感兴趣的文章
AutoCompleteTextView 与sqlite绑定实现记住用户输入的内容并自动提示
查看>>
Makefile 中会在多处地方看到 FORCE
查看>>
hadoop参数传递
查看>>
揭秘uc浏览器四
查看>>
用条件注释判断浏览器版本,解决兼容问题
查看>>
通过IEnumerable和IDisposable实现可暂停和取消的任务队列
查看>>
纯css3制作写轮眼开眼及进化过程
查看>>
OSX终端 命令行的一些基本操作
查看>>
再谈ORACLE CPROCD进程
查看>>
MVC5+EF6 入门完整教程五
查看>>
Sqlserver Sequence操作
查看>>
开发创建XMPP“发布订阅”扩展(xmpp pubsub extend)
查看>>
TCP/IP-协议族----17、应用层简单
查看>>
ZOJ1093 动态规划
查看>>
.Echo 命令中经常提到回显,是什么意思?
查看>>
MySQL在大数据Limit使用
查看>>
iOS中如何创建一个滑出式导航面板(1)
查看>>
Solr5.3.1整合IKAnalyzer
查看>>
Swift - 06 - 数值类型转换和类型别名
查看>>
华为3G模块EM770W在LINUX下的驱动安装
查看>>