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

于是就要知道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. python 可变类型和不可变类型

    1. 什么是不可变类型变量对应的值中的数据是不能被修改,如果修改就会生成一个新的值从而分配新的内存空间.不可变类型: 数字(int,long,float) 布尔(bool) 字符串(string) 元 ...

  2. OAUTH2.0协议-菜鸟级

    OAUTH2.0入门必看 一.摘要 OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即 ...

  3. angularJS拦截路由

    $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams)

  4. oracle存储过程调试-plsql

    1.搜索找到存储过程的包,并打开 选中右击--view spec&body 2.找到要测试的存储过程,设置断点,进行测试

  5. Eclipse Kepler安装WST Server Adapter后创建Server无Tomcat解决方法

    在Eclipse Kepler下安装完WST Server Adapter后,创建Server时发现没有Tomcat服务器的选项,这个问题解决起来很简单, 只需要安装一下JST Server Adap ...

  6. Android APP 登陆模块

    首先我想强调一点.这个登陆的模块最好是放在另外一个线程里面来实现.否则有可能会爆出一系列的问题, 然后再与主UI 交互.这样就不会爆ANR异常 1.对于登陆模块的.首先大体的逻辑肯定是要清晰的.    ...

  7. vue 中公共样式

    html, body, h1, h2, h3, h4, h5, h6, p, textarea, input, select, ul, ol, li, fieldset, figure { margi ...

  8. 任务21 :了解ASP.NET Core 依赖注入,看这篇就够了

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

  9. 【JAVA】毕向东Java基础视频教程-笔记

    传智播客-毕向东Java基础视频教程 <2013年-33days>版-学习代码记录 链接: GitHub库:JavaBXD33 目录 01-Java基础知识 02-Java对象细节 03- ...

  10. node的fs模块使用————node

    node的fs模块使用----node fs模块是调用文件的模块. var fs=require('fs'); //引用模块. //查看文件信息 fs.stat('index.txt',functio ...