BZOJ 4128: Matrix

标签(空格分隔): OI BZOJ 大步小步 矩阵 费马小定理


Time Limit: 10 Sec

Memory Limit: 128 MB


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


Solution####

大步小步算法\({A^{x}\equiv B\pmod p}\)

设\({A^{a\sqrt{p}-b}\equiv B\pmod p}\)

变换可得\({A^{a\sqrt{p}}\equiv B*A^{b}\pmod p}\)

对\({A^{a\sqrt{p}}\pmod{p}}\)预处理

在hash表中查找和\({B*A^{b}\pmod{p}}\)相同的

时间复杂度\({n^{3}*\sqrt{p}}\)


Code####

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<bitset>
#include<vector>
using namespace std;
const int N=0,M=0;
int read()
{int s=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+ch-'0';ch=getchar();}
return s*f;
}
//smile please
int n,P,L;
int cf[70];
struct matrix
{
long long s[70][70];
void one()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
s[i][j]=(i==j);
}
void readin()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
s[i][j]=read();
}
int hash()
{
int ss=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
ss=ss*189211+s[i][j];
return ss;
}
void operator*=(matrix b)
{matrix a;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a.s[i][j]=s[i][j],
s[i][j]=0;
for(int j=0;j<n;j++)
{
for(int i=0;i<n;i++)cf[i]=b.s[i][j];
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
s[i][j]+=a.s[i][k]*cf[k];
s[i][j]%=P;
}
}
}
}A,B;
int he[1<<16],hn[1<<16],hv[1<<16],hl[1<<16],hw=1;
void put(int u,int v,int l)
{hw++;hn[hw]=he[u];he[u]=hw;hv[hw]=v;hl[hw]=l;}
int ans=0;
int main()
{
n=read(),P=read();
A.readin();B.readin();
L=sqrt(P);ans=-1;
matrix S=A,k=B;
for(int i=1;i<=L;i++)
{k*=A;if(i!=1)S*=A;
int ha=k.hash();
put(ha&((1<<16)-1),ha,i);
}
matrix SS=S;
for(int i=L;i<=P+L&&ans==-1;i+=L,SS*=S)
{
int ha=SS.hash();
for(int j=he[ha&((1<<16)-1)];j&&ans==-1;j=hn[j])
if(hv[j]==ha)
ans=i-hl[j];
}
if(ans==-1)
printf("no solution\n");
else
printf("%d\n",ans);
return 0;
}

BZOJ 4128: Matrix的更多相关文章

  1. bzoj 4128: Matrix ——BSGS&&矩阵快速幂&&哈希

    题目 给定矩阵A, B和模数p,求最小的正整数x满足 A^x = B(mod p). 分析 与整数的离散对数类似,只不过普通乘法换乘了矩阵乘法. 由于矩阵的求逆麻烦,使用 $A^{km-t} = B( ...

  2. BZOJ 4128 Matrix BSGS+矩阵求逆

    题意:链接 方法: BSGS+矩阵求逆 解析: 这题就是把Ax=B(mod C)的A和B换成了矩阵. 然而别的地方并没有修改. 所以就涉及到矩阵的逆元这个问题. 矩阵的逆元怎么求呢? 先在原矩阵后接一 ...

  3. BZOJ 4128 Matrix ——BSGS

    矩阵的BSGS. 只需要哈希一下存起来就可以了. 也并不需要求逆. #include <map> #include <cmath> #include <cstdio> ...

  4. BZOJ 4128: Matrix (矩阵BSGS)

    类比整数的做法就行了 1A爽哉 #include<bits/stdc++.h> using namespace std; typedef long long LL; const int M ...

  5. 【题解】Matrix BZOJ 4128 矩阵求逆 离散对数 大步小步算法

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 大水题一道 使用大步小步算法,把数字的运算换成矩阵的运算就好了 矩阵求逆?这么基础的线 ...

  6. 【BZOJ】4128: Matrix

    题解 学习一下矩阵求逆 就是我们考虑这个矩阵 \(AA^{-1} = I\) 我们相当于让\(A\)乘上一个矩阵,变成\(I\) 我们可以利用初等行变换(只能应用初等行变换,或只应用初等列变换) 分三 ...

  7. bzoj 4128 矩阵求逆

    /************************************************************** Problem: 4128 User: idy002 Language: ...

  8. BZOJ 2351 Matrix(哈希)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2351 题意:给出一个n*m的01矩阵.再给出10个A*B的小01矩阵.判断这些小的矩阵是 ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. 初等变换求 |A| % Mod & A- % Mod & A* % Mod(模板)

    // |A| * A- = A* (伴随矩阵) = 逆矩阵 * 矩阵的值 #include<cstdio> #include<cstring> #include<cstd ...

  2. Spring MVC 简述:从MVC框架普遍关注的问题说起

    任何一个完备的MVC框架都需要解决Web开发过程中的一些共性的问题,比如请求的收集与分发.数据前后台流转与转换,当前最流行的SpringMVC和Struts2也不例外.本文首先概述MVC模式的分层思想 ...

  3. HDU1863-畅通工程

    题目链接:点击打开链接 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即 ...

  4. CoinEye PRIVACY POLICY

    PRIVACY POLICY First, welcome to use the app Thank you for using our products and services ("Se ...

  5. git教程3-分支

    https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E7%AE%A1%E7%90%86 ...

  6. vue实现复制功能(项目使用)

    安装依赖 npm install --save vue-clipboard2 用法: import Vue import VueClipboard from 'vue-clipboard2' Vue. ...

  7. windows下安装python包

    1.windows下成功安装好python后,在安装目录的Scripts目录下有easy_install和pip工具 2.如果没有安装pip,进入命令行,切换到python的安装目录下的Scripts ...

  8. docker镜像的分层结构三

    docker的镜像分层 docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构. 实验 比如说使用dockerfile去创建一个最简单的hello镜像.创建好对应的d ...

  9. 常见的web性能优化方法

    前言:关于优化问题,随着项目经验不断累积,多方查找资料进行拼接合并,形成如下文章,之后遇到类似好的方法,会不断补充完善. 前端是庞大的,包括 HTML. CSS. Javascript.Image . ...

  10. python_魔法方法(六):迭代器和生成器

    迭代器 自始至终,都有一个概念一直在用,但是我们却没来都没有人在的深入剖析它.这个概念就是迭代. 迭代的意思有点类似循环,每一次的重复的过程被称为迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭 ...