【BZOJ 4128】 matrix
2015-07-01 20:45
344 查看
题目其实很简单,BSGS可以一眼看出来,但这就需要矩阵求逆,然而我并不会。。。
于是发现了一种BSGS的非求逆方法,借此介绍一下。
aix−y=b(modP)a^{ix-y}=b (mod P) 推出
aix=b∗ay(modP)a^{ix}=b*a^y(mod P)
因此我们只需要对每个b∗ayb*a^yhash一下就好了,然后穷举ii,验证是否存在即可。code:
于是发现了一种BSGS的非求逆方法,借此介绍一下。
aix−y=b(modP)a^{ix-y}=b (mod P) 推出
aix=b∗ay(modP)a^{ix}=b*a^y(mod P)
因此我们只需要对每个b∗ayb*a^yhash一下就好了,然后穷举ii,验证是否存在即可。code:
[code]#include<cstdio> #include<cstring> #include<cmath> #include<map> using namespace std; int n,P; struct hp{ int num[71][71]; bool operator < (const hp& a)const { int i,j; for (i=1;i<=n;++i) for (j=1;j<=n;++j) { if (num[i][j]<a.num[i][j]) return true; if (num[i][j]>a.num[i][j]) return false; } return false; } bool operator > (const hp& a)const { int i,j; for (i=1;i<=n;++i) for (j=1;j<=n;++j) { if (num[i][j]<a.num[i][j]) return false; if (num[i][j]>a.num[i][j]) return true; } return false; } bool operator == (const hp& a)const { int i,j; for (i=1;i<=n;++i) for (j=1;j<=n;++j) { if (num[i][j]<a.num[i][j]) return false; if (num[i][j]>a.num[i][j]) return false; } return true; } }a,b; hp mult(hp a,hp b) { hp c;int i,j,k; for (i=1;i<=n;++i) for (j=1;j<=n;++j) { c.num[i][j]=0; for (k=1;k<=n;++k) c.num[i][j]=(c.num[i][j]+a.num[i][k]*b.num[k][j])%P; } return c; } int bsgs() { int i,j,m; hp e,mi,xi; map<hp,int>x; for (i=1;i<=n;++i) for (j=1;j<=n;++j) e.num[i][j]=b.num[i][j]; m=(int)(sqrt(P)+0.5); x[e]=0; for (i=1;i<=m;++i) { e=mult(e,a); x[e]=i; } for (i=1;i<=n;++i) for (j=1;j<=n;++j) { mi.num[i][j]=0; if (i==j) mi.num[i][j]=1; } for (i=1;i<=m;++i) mi=mult(mi,a); xi=mi; for (i=1;i<=m;++i) { if (x.count(mi)) return i*m-x[mi]; mi=mult(mi,xi); } } int main() { int i,j; scanf("%d%d",&n,&P); for (i=1;i<=n;++i) for (j=1;j<=n;++j) scanf("%d",&a.num[i][j]); for (i=1;i<=n;++i) for (j=1;j<=n;++j) scanf("%d",&b.num[i][j]); printf("%d\n",bsgs()); }
相关文章推荐
- 时间复杂度
- mybatis的基础知识 (一)
- android中控件Dialog对话框的使用
- git基础
- Linux mv 命令
- 鸟哥的Linux私房菜-----5、Linux文件权限与目录配置
- 如何解决终端服务器超出了最大允许连接数
- java中四种引用类型
- autolayout - sizeClass - Masonry - 1
- C++13.5类-----指针成员
- RelativeSource={RelativeSource TemplatedParent}
- 防火墙与入侵检测知识整理 (二)
- ZOJ Problem Set - 1049
- JVM调优总结
- R包的安装和使用
- Majority Element II
- 单片机ad 中的注意事项1。
- centos6中三台物理机配置nginx+keepalived+lvs
- 背景实现功能
- 读《Node.js项目实践:构建可扩展的Web应用》 ——引编程慢慢变成系统化的“砌砖活”...