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

于是就要知道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. SPOJ NICEBTRE - Nice Binary Trees(树 先序遍历)

    传送门 Description Binary trees can sometimes be very difficult to work with. Fortunately, there is a c ...

  2. Git009--分支管理&创建与合并分支

    Git--分支管理&创建与合并分支 一.分支管理 本文来自于:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578 ...

  3. spring security简单教程以及实现完全前后端分离

    spring security是spring家族的一个安全框架,入门简单.对比shiro,它自带登录页面,自动完成登录操作.权限过滤时支持http方法过滤. 在新手入门使用时,只需要简单的配置,即可实 ...

  4. forEach究竟能不能改变数组的值

    forEach究竟能不能改变数组的值 :https://blog.csdn.net/ZhengKehang/article/details/81281563 初学者每次提到Array对象的时候有些烦人 ...

  5. Linux远程软件xshell的使用

    Xshell是一个linux远程命令行软件 有免费版不用破解,安装包可以找有关人士获取 要新远程一台机,可以新建会话,输入被远程系统的参数 新建会话后,点连接开始远程 远程成功的样子

  6. Quartz的简单使用

    一.Quartz 介绍 Quartz是Java领域最著名的.功能丰富的.开放源码的作业调度工具,几乎可以在所有的Java应用程序中集成--从小的单机应用到大的电子商务系统. Quartz可以用来执行成 ...

  7. Java源码之ArrayList分析

    一.ArrayList简介 ArrayList底层的数据结构是数组,数组元素类型为Object类型,即可以存放所有类型数据. 与Java中的数组相比,它的容量能动态增长.当创建一个数组的时候,就必须确 ...

  8. windows下nvm的安装及使用

    由于更新了npm版本之后导致npm的命令都会报错,一顿百度,明白了nvm可以管理node版本的,下面是操作过程: 如果在安装nvm之前已经下载了node 需要把node卸载!!! 需要把node卸载! ...

  9. [转载]Linux上使用ssl进行端口转发

    原文地址:Linux上使用ssl进行端口转发 作者:呼延十 背景介绍 作为一个后端程序员,经常要和别人联调接口,每当这时,总是被公司的各种,dev,qa,pre,prod环境搞得头疼,,,我真的只是想 ...

  10. ArrayList、LinkedList、Vector区别

    ArrayList.LinkedList.Vector均为可伸缩数组,即可以动态改变长度的数组. 比较ArrayList和Vector: 1. 共同点: ArrayList和Vector都是基于Obj ...