bzoj 2242: [SDOI2011]计算器 & BSGS算法笔记
这题的主要难点在于第三问该如何解决
于是就要知道BSGS是怎样的一种方法了
首先BSGS是meet in the middle的一种(戳下面看)
http://m.blog.csdn.net/blog/zentropy/11200099
看完链接后再看以下内容
---------------------------------------------------------------------------------------------------------------------
对于一个质数$p$我们由费马小定理知道$y^{x}mod p$最多$(p-1)$次便是一个循环节
因此如果有解$x$一定在$0$到$p-1$中
所以我们只需知道$x$取$0$到$p-1$是否有解即可
根据meet in the middle 的思想 令$m=\sqrt{p-1}$
那么我们仅需先求出 $x$为$0$到$m-1$的(如果有解这里就退出)
然后再求出 $x$为$m,2m,3m……nm(nm \leq p-1)$
分别询问$y^0$到$y^{m-1}$中是否有和$y^{km}$乘起来$=z(modp)$的
然而显然我们这个操作直接做的话 是$\sqrt{n}*\sqrt{n}=n$的
所以学过逆元怎么求了之后可以将$y^{km}(modp)$意义下的逆元与z相乘
然后再询问$y^0$到$y^{m-1}$中有没有与它相等的即可
这样去做就是$\sqrt{n}$*hash的复杂度
有手动hash技巧的话 hash复杂度可以看做1
比较懒的话 直接用map来hash就是$\log{(n)}$
#include <bits/stdc++.h>
using namespace std;
map<int,int> mp;
int solve1(int x,int y,int mod)
{
long long t=x,re=;
while(y)
{
if(y&)
re=re*t%mod;
t=t*t%mod;
y>>=;
}
return (int)re;
}
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=;
y=;
return a;
}
int t,d;
d=exgcd(b,a%b,x,y);
t=x;
x=y;
y=t-(a/b)*x;
return d;
}
void solve2(int y,int z,int p)
{
int x,yy;
int d=exgcd(y,p,x,yy);
if(z%d)
{
puts("Orz, I cannot find x!");
return;
}
x=(long long)x*(z/d)%p;
x=(x<?x+p:x);
printf("%d\n",x);
}
bool solve3(int y,int z,int p)
{
// if(z>=p)
// return 0;
y%=p;
if(!y)
{
if(z)
return ;
puts("");
return ;
}
mp.clear();
int m=ceil(sqrt(p-));
long long t=;
for(int i=;i<m;++i)
{
if(t==z)
{
printf("%d\n",i);
return ;
}
if(!mp[t])
mp[t]=i+;
else
return ;
t=t*y%p;
}
int inv=solve1(y,p--m,p);
t=z;
for(int i=m;i<=p-;i+=m)
{
t=t*inv%p;
if(mp[t])
{
printf("%d\n",i+mp[t]-);
return ;
}
}
return ;
}
int main()
{
int t,ca,y,z,p;
scanf("%d%d",&t,&ca);
while(t--)
{
scanf("%d%d%d",&y,&z,&p);
if(ca==)
printf("%d\n",solve1(y,z,p));
else if(ca==)
solve2(y,z,p);
else if(ca==)
if(!solve3(y,z,p))
puts("Orz, I cannot find x!");
}
return ;
}
bzoj 2242: [SDOI2011]计算器 & BSGS算法笔记的更多相关文章
- bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...
- bzoj 2242 [SDOI2011]计算器——BSGS模板
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2242 第一道BSGS! 咳咳,我到底改了些什么?…… 感觉和自己的第一版写的差不多……可能是 ...
- BZOJ 2242 [SDOI2011]计算器 BSGS+高速幂+EXGCD
题意:id=2242">链接 方法: BSGS+高速幂+EXGCD 解析: BSGS- 题解同上.. 代码: #include <cmath> #include <c ...
- BZOJ 2242 [SDOI2011]计算器 | BSGS
insert的时候忘了取模了-- #include <cstdio> #include <cmath> #include <cstring> #include &l ...
- BZOJ 2242: [SDOI2011]计算器( 快速幂 + 扩展欧几里德 + BSGS )
没什么好说的... --------------------------------------------------------------------- #include<cstdio&g ...
- BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]
2242: [SDOI2011]计算器 题意:求\(a^b \mod p,\ ax \equiv b \mod p,\ a^x \equiv b \mod p\),p是质数 这种裸题我竟然WA了好多次 ...
- bzoj 2242 [SDOI2011]计算器(数论知识)
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...
- bzoj2242: [SDOI2011]计算器 && BSGS 算法
BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...
- BZOJ.2242.[SDOI2011]计算器(扩展欧几里得 BSGS)
同余方程都不会写了..还一直爆int /* 2.关于同余方程ax ≡b(mod p),可以用Exgcd做,但注意到p为质数,y一定有逆元 首先a%p=0时 仅当b=0时有解:然后有x ≡b*a^-1( ...
随机推荐
- 获取EasyUI日期输入框的值
var date = $('#PurDate').datebox('getValue');
- Ajax局部刷新(使用JS操作)
对于在不使用Ajax的情况下,使用JS来进行局部刷新,主要有如下的几步: 1. 得到XMLHttpRequest 2. 使用open方法打开连接 3. 设置请求头信息 4. 注册onreadystat ...
- Waiter.js
var Waiter = function() { var dfd = [], doneArr = [], failArr = [], slic ...
- SpringBoot-技术专区-详细打印启动时异常堆栈信息
SpringBoot在项目启动时如果遇到异常并不能友好的打印出具体的堆栈错误信息,我们只能查看到简单的错误消息,以致于并不能及时解决发生的问题,针对这个问题SpringBoot提供了故障分析仪的概念( ...
- elasticsearch 基础 —— Jion父子关系
前言 由于ES6.X版本以后,每个索引下面只支持单一的类型(type),因此不再支持以下形式的父子关系: PUT /company { "mappings": { "br ...
- elasticsearch 基础 —— _mget取回多个文档及_bulk批量操作
取回多个文档 Elasticsearch 的速度已经很快了,但甚至能更快. 将多个请求合并成一个,避免单独处理每个请求花费的网络延时和开销. 如果你需要从 Elasticsearch 检索很多文档,那 ...
- XMPP即时通讯协议使用(前传)——协议详解
XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...
- 【转载】关于Maven项目build时出现No compiler is provided in this environment的处理
参考地址;https://blog.csdn.net/lslk9898/article/details/73836745
- 只用ipv6 两台机器共享文件夹, 局域网连接路径,共享文件夹路径中ipv6地址如何表示
1. 首先要确认你的DNS服务器支持IPv6,一般是指网络中的路由. 2. 如果网络中没有路由,则直接在hosts文件中添加对方的IPv6地址与名字. 3. 利用UNC路径,把冒号修改为连字符并附加. ...
- 关于linux的日志
日志的三种类型# 内核及系统日志: 这种日志数据由系统服务rsyslog统一管理,根据其主配置文件/etc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置.系统中有相当 ...