博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 4128 Matrix ——BSGS
阅读量:6149 次
发布时间:2019-06-21

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

矩阵的BSGS。

只需要哈希一下存起来就可以了。

也并不需要求逆。

#include #include 
#include
#include
#include
#include
using namespace std; #define F(i,j,k) for (ll i=j;i<=k;++i)#define D(i,j,k) for (ll i=j;i>=k;--i)#define ll long long#define base 231#define basemd 1000000007 ll n,p; struct matrix{ ll x[80][80]; void init(){memset(x,0,sizeof x);} matrix operator * (matrix a){ matrix ret; ret.init(); F(i,1,n) F(j,1,n) { F(k,1,n) ret.x[i][j]=ret.x[i][j]+x[i][k]*a.x[k][j]; ret.x[i][j]%=p; } return ret; } ll encode() { ll ret=0; F(i,1,n) F(j,1,n) ret=(ret*base+x[i][j])%basemd; return ret; } void read() { F(i,1,n) F(j,1,n) scanf("%lld",&x[i][j]),x[i][j]%=p; } void build() {init();F(i,1,n)x[i][i]=1;}}A,B,E; map
mp; void BSGS(){ mp.clear(); ll m=ceil(sqrt(p)); matrix ans; F(i,0,m) { if (i==0){ans=B;mp[ans.encode()]=i;continue;} ans=ans*A; mp[ans.encode()]=i; } matrix tmp=E; F(i,1,m) tmp=tmp*A; ans=E; F(i,1,m) { ans=ans*tmp; if (mp[ans.encode()]) { ll ret=i*m-mp[ans.encode()]; printf("%lld\n",(ret%p+p)%p); return ; } }} int main(){ scanf("%lld%lld",&n,&p); A.read();B.read();E.build(); BSGS();}

  

转载于:https://www.cnblogs.com/SfailSth/p/6582025.html

你可能感兴趣的文章
jenkins updatecenter更新插件有问题
查看>>
一个BUG的发现、定位和解决
查看>>
Oacle sys用户无法使用sysdba登录
查看>>
linux下svn命令大全
查看>>
Nginx源码分析(6)
查看>>
PHP 微信扫码支付
查看>>
shell脚本批量替换文件名和文件的内容
查看>>
遍历元组写excel,读excel文件
查看>>
一个正则引发的 java CPU异常问题
查看>>
java中的参数传递方式以及内存分配情况
查看>>
[原]解决pacman git无法自动补全的问题
查看>>
Shell编程中的变量【转载】
查看>>
国内一些大公司(阿里巴巴、腾讯、百度、网易、豆瓣等)的开源项目
查看>>
学习笔记 二十: load balancer
查看>>
Linux文件权限管理
查看>>
魔兽世界私服Trinity,从源码开始
查看>>
Three.js / DOC (一) 创建一个场景
查看>>
zabbix使用LDAP认证
查看>>
服务器性能优化
查看>>
C#中yield用法
查看>>