题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2242

第一次写BSGS,参考了好多好多博客;

然而看到的讲解和模板是一种写法,这道题的网上题解又全都是另一种写法,还是写讲解版吧,注释里是另一种写法;

第一次写嘛,WA到不行,反反复复交了20多遍,原来是 exgcd 写错了囧,改了那么多,不知从何时开始对的...

BSGS意外地挺好写的!

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<cmath>
using namespace std;
typedef long long ll;
map<ll,int>mp;
ll T,x,y,Y,Z,P,tp;
ll pw(ll a,ll b,ll mod)
{
ll ret=;
for(;b;b>>=1ll,a=(a*a)%mod)
if(b&)ret=(ret*a)%mod;
return ret;
}
ll gcd(ll a,ll b){return a%b?gcd(b,a%b):b;}
ll BSGS()
{
mp.clear();
if(Y%P==)return -;
ll m=ceil(sqrt(P));
ll tmp=Z;//tmp=1
for(int j=;j<=m;j++)//
{
if(!j){mp[tmp]=j; continue;}
tmp=(tmp*Y)%P;
mp[tmp]=j;
}
// tmp=pw((pw(Y,m,P)),P-2,P); ll nw=Z%P;
tmp=pw(Y,m,P); ll nw=tmp;//
for(int i=;i<=m;i++)//
{
if(mp[nw])return (i*m%P-mp[nw]%P+P)%P;//i*m+mp[nw]
nw=(nw*tmp)%P;
}
return -;
}
void exgcd(ll a,ll b,ll &x,ll &y){
if(!b){x=,y=;return;}
exgcd(b,a%b,x,y);
ll t=x;x=y;y=t-a/b*y;
}
int main()
{
scanf("%lld%lld",&T,&tp);
while(T--)
{
scanf("%lld%lld%lld",&Y,&Z,&P);
if(tp==){printf("%lld\n",pw(Y,Z,P));}
if(tp==)
{
ll g=gcd(Y,P);
if(Z%g){printf("Orz, I cannot find x!\n");continue;}
Y/=g; P/=g; Z/=g;
exgcd(Y,P,x,y);
printf("%lld\n",(x*Z%P+P)%P);//*Z 而非 *g !!!
}
if(tp==)
{
ll ans=BSGS();
if(ans==-)printf("Orz, I cannot find x!\n");
else printf("%lld\n",ans);
}
}
return ;
}

bzoj2242 [SDOI2011]计算器——BSGS的更多相关文章

  1. bzoj2242: [SDOI2011]计算器 BSGS+exgcd

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

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

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

  3. 【BZOJ2242】[SDOI2011]计算器 BSGS

    [BZOJ2242][SDOI2011]计算器 Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ ...

  4. BZOJ2242 [SDOI2011]计算器 【BSGS】

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4741  Solved: 1796 [Submit][Sta ...

  5. [bzoj2242][Sdoi2011]计算器_exgcd_BSGS

    计算器 bzoj-2242 Sdoi-2011 题目大意:裸题,支持快速幂.扩展gcd.拔山盖世 注释:所有数据保证int,10组数据. 想法:裸题,就是注意一下exgcd别敲错... ... 最后, ...

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

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

  7. BZOJ2242[SDOI2011]计算器——exgcd+BSGS

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

  8. 【数学 BSGS】bzoj2242: [SDOI2011]计算器

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

  9. 【数论】【快速幂】【扩展欧几里得】【BSGS算法】bzoj2242 [SDOI2011]计算器

    说是BSGS……但是跟前面那题的扩展BSGS其实是一样的……因为模数虽然是质数,但是其可能可以整除a!!所以这两者其实是一样的…… 第一二种操作不赘述. #include<cstdio> ...

随机推荐

  1. Spring框架系列(一)--Spring MVC基础知识

    Web项目开发过程中一般都是使用MVC(Model-View-Controller)模式,早先的Struts2到Spring MVC,再到现在Spring Boot,都是相似的思 路.Spring B ...

  2. ThinkPHP---TP功能类之上传

    [一]概论 (1)上传操作的核心操作:移动临时文件(move_upload_file),在ThinkPHP里封装了上传类Upload.class.php (2)上传类Upload.class.php代 ...

  3. Java怎么实现文件数据拷贝

    实现一个文件的内容拷贝到另一个文件里 public void copyDemo () throws IOException { //创建文件输入流 FileInputStream fis = new ...

  4. 怎么让Eclipse对html和js代码自动提示

    使用eclipse自带的插件,无需另外安装插件,具体步骤如下1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist修改Auto Activ ...

  5. oracle 安装准备

    1.选择数据库 (官网查询支持的操作系统) 2.选择系统 (官网查询支持的硬件)(更新补丁) 3.选择硬件 (io性能测试--oracle 大量小文件读写) 4.oracle 升级(和打补丁) 5.o ...

  6. xmpp之配置Xcode(1)

    介绍 ios上的XMPPFramework你能够在Xcode/iPhoneXMPP 目录找到,它只是实现了XMPP的一小部分功能. 下面主要介绍在开发XMPPFramework ios应用之前的配置工 ...

  7. IP地址、MAC地址、ARP地址解析协议

    互联网中一台主机要和另一台主机实现通信首先需要知道彼此在互联网中的位置,主机在互联网中的位置是通过ip地址标记的,当找到ip地址后,再通过端口号标识运行在主机中的进程从而实现通信. IP地址: IP地 ...

  8. C语言结构体用法

    结构体的定义: 方法一: struct student { char name[10]; int age; int number; }; struct student stu1; 方法二: struc ...

  9. Random和ArrayList的应用

    /*Random类应用与Math类应用,创建一个类, * 1)分别用Random类和Math.random()方法生成随机数. * 2) 把Math.random()方法生成的随机数,转换成1-100 ...

  10. mac下Redis安装和使用

    前言 本篇文章主要讲述了Mac下Redis的安装和使用的经验,并将python如何操作Redis做了简单介绍. 1. redis 安装 和启动 1.1 用brew安装 查看系统是否已经安装了Redis ...