这题的主要难点在于第三问该如何解决

于是就要知道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算法笔记的更多相关文章

  1. bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...

  2. bzoj 2242 [SDOI2011]计算器——BSGS模板

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2242 第一道BSGS! 咳咳,我到底改了些什么?…… 感觉和自己的第一版写的差不多……可能是 ...

  3. BZOJ 2242 [SDOI2011]计算器 BSGS+高速幂+EXGCD

    题意:id=2242">链接 方法: BSGS+高速幂+EXGCD 解析: BSGS- 题解同上.. 代码: #include <cmath> #include <c ...

  4. BZOJ 2242 [SDOI2011]计算器 | BSGS

    insert的时候忘了取模了-- #include <cstdio> #include <cmath> #include <cstring> #include &l ...

  5. BZOJ 2242: [SDOI2011]计算器( 快速幂 + 扩展欧几里德 + BSGS )

    没什么好说的... --------------------------------------------------------------------- #include<cstdio&g ...

  6. BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]

    2242: [SDOI2011]计算器 题意:求\(a^b \mod p,\ ax \equiv b \mod p,\ a^x \equiv b \mod p\),p是质数 这种裸题我竟然WA了好多次 ...

  7. bzoj 2242 [SDOI2011]计算器(数论知识)

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

  8. bzoj2242: [SDOI2011]计算器 && BSGS 算法

    BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...

  9. BZOJ.2242.[SDOI2011]计算器(扩展欧几里得 BSGS)

    同余方程都不会写了..还一直爆int /* 2.关于同余方程ax ≡b(mod p),可以用Exgcd做,但注意到p为质数,y一定有逆元 首先a%p=0时 仅当b=0时有解:然后有x ≡b*a^-1( ...

随机推荐

  1. 网络流强化-HDU4280

    数组没开够居然显示TLE而不是RE,自己觉得好的优化的方法没什么用…… //http://www.renfei.org/blog/isap.html 带解释的 //https://www.cnblog ...

  2. SEC8 - MySQL 查询语句--------------进阶4:常见的函数

    # 进阶4:常见的函数 /* 概念:将一组逻辑语句封装在方法体中,对外暴露方法名 好处:1.隐藏了实现细节 2.提高代码的复用性 调用: select 函数名() [from 表]; 特点: (1)叫 ...

  3. Java8数据流

    流/Stream是在JAVA8中引入的一个抽象,可以处理类似SQL语句声明数据. 例如,考虑下面的SQL语句. SELECT max(salary),employee_id,employee_name ...

  4. Learning OSG programing---osgAnimation(1)

    osg::AnimationPath* createAnimationPath(const osg::Vec3& center,float radius,double looptime) { ...

  5. 简单谈谈Netty的高性能之道

    传统RPC 调用性能差的三宗罪 网络传输方式问题:传统的RPC 框架或者基于RMI 等方式的远程服务(过程)调用采用了同步阻塞IO,当客户端的并发压力或者网络时延增大之后,同步阻塞IO 会由于频繁的w ...

  6. RMQ(连续相同最大值)

    http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submi ...

  7. django的orm操作优化

    django的orm操作优化 models.py from django.db import models class Author(models.Model): name = models.Char ...

  8. python依赖包整体迁移方法(pip)

    做个记录 python依赖包整体迁移方法

  9. hdu 1828 Picture(线段树轮廓线)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  10. Mysql命令收集【重要】

    1.在linux上获取Mysql服务器状态,及版本: [root@host]# mysqladmin --version 结果信息: mysqladmin  Ver 8.42 Distrib 5.7. ...