BZOJ 4128: Matrix
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的更多相关文章
- bzoj 4128: Matrix ——BSGS&&矩阵快速幂&&哈希
题目 给定矩阵A, B和模数p,求最小的正整数x满足 A^x = B(mod p). 分析 与整数的离散对数类似,只不过普通乘法换乘了矩阵乘法. 由于矩阵的求逆麻烦,使用 $A^{km-t} = B( ...
- BZOJ 4128 Matrix BSGS+矩阵求逆
题意:链接 方法: BSGS+矩阵求逆 解析: 这题就是把Ax=B(mod C)的A和B换成了矩阵. 然而别的地方并没有修改. 所以就涉及到矩阵的逆元这个问题. 矩阵的逆元怎么求呢? 先在原矩阵后接一 ...
- BZOJ 4128 Matrix ——BSGS
矩阵的BSGS. 只需要哈希一下存起来就可以了. 也并不需要求逆. #include <map> #include <cmath> #include <cstdio> ...
- BZOJ 4128: Matrix (矩阵BSGS)
类比整数的做法就行了 1A爽哉 #include<bits/stdc++.h> using namespace std; typedef long long LL; const int M ...
- 【题解】Matrix BZOJ 4128 矩阵求逆 离散对数 大步小步算法
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 大水题一道 使用大步小步算法,把数字的运算换成矩阵的运算就好了 矩阵求逆?这么基础的线 ...
- 【BZOJ】4128: Matrix
题解 学习一下矩阵求逆 就是我们考虑这个矩阵 \(AA^{-1} = I\) 我们相当于让\(A\)乘上一个矩阵,变成\(I\) 我们可以利用初等行变换(只能应用初等行变换,或只应用初等列变换) 分三 ...
- bzoj 4128 矩阵求逆
/************************************************************** Problem: 4128 User: idy002 Language: ...
- BZOJ 2351 Matrix(哈希)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2351 题意:给出一个n*m的01矩阵.再给出10个A*B的小01矩阵.判断这些小的矩阵是 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- Cogs 9. 中心台站建设
9. 中心台站建设 ★★☆ 输入文件:zpj.in 输出文件:zpj.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] n个城市之间有通讯网络,从这n个城 ...
- EasyUI/TopJUI之如何动态改变下拉列表框ComboBox输入框的背景颜色
简单记录一下 前段时间接到客户需求:动态改变下拉列表框ComboBox输入框的背景颜色. 刚开始想的很简单在用户选择列表项的时候,判断一下列表框的value值添加相应的背景颜色就OK了,然而在实际操作 ...
- 关于STL库中的max min swap
嗯... 不得不说c++中的STL库是一个神奇的东西 可以使你的代码显得更加简洁.... 今天就只讲STL中的三个鬼畜: max min swap 具体操作 ...
- nodejs安装及使用步骤详解
就一段小小的时间不用,就忘得差不多了,果然好记性不如乱笔头. 1.必须要安装node环境(建议装在C盘,这是一个系统盘)+安装mongoose数据库 +Robot 3T之于mongodb就相当于so ...
- 原生Ajax实现
发现一件可怕的事情,前端学不完了,春招要开始了.唉,人生苦短.
- code和pre竟然有区别!!!!
坑爹的,今天复习基础,本来写了个获取样式,为了显示出我的代码,才发现了 code和pre标签竟然是不同的. 1.用 JS 的代码注释风格来说 code 就是 // , <pre> 就是 / ...
- vue 生产模式
vue.js 最后一行添加... Vue.config.productionTip = false;
- PDO中构建事务处理的应用程序
<meta http-equiv="Content-Type" content="text/html";charse="utf-8" ...
- Spark (Python版) 零基础学习笔记(二)—— Spark Transformations总结及举例
1. map(func) 将func函数作用到数据集的每个元素,生成一个新的分布式的数据集并返回 >>> a = sc.parallelize(('a', 'b', 'c')) &g ...
- B. Filya and Homework
http://codeforces.com/contest/714/problem/B 给定一个序列,对于每一个元素,只能 + 或者 - 一个数val.这个数一旦选定,就不能改. 问能否变成全部数字都 ...