k=1:裸的快速幂
k=2:xy=z+kp,直接exgcd,这个可以不用解释了,不懂的同学可以看代码
k=3:裸的BSGS
重点是k=3(BSGS学习)
ax=b(mod p)求解这个同余方程
只能求gcd(a,p)=1的情况。
如何求解?很容易发现解一定位于{0,p-1}之间,设q=ceil(√p),然后x可以表示成cq-d
因为ax=b(mod p),所以acq=b*ad(mod p)
于是可以这样考虑:枚举d∈[1,q],将值插入哈希表,如有重复的则只记录最大的d,因为本题是求最小解,再枚举c=1...q,查询acq是否在哈希表内,如果在就可以直接跳出来。
注意要特判a或b等于0的情况就可以了。
不说太多了,直接上模板:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<int,int>hsh;
ll y,z,p;
ll qpow(ll a,ll b)
{
a%=p;
ll ret=;
while(b)
{
if(b&)ret=ret*a%p;
a=a*a%p,b>>=;
}
return ret;
}
ll exgcd(ll a,ll b,ll&x,ll&y)
{
if(b==){x=,y=;return a;}
ll ret=exgcd(b,a%b,y,x);y-=a/b*x;
return ret;
}
void solve2(ll a,ll b)
{
ll x,y,ans,d,s;
d=exgcd(a,p,x,y);
if(b%d){puts("Orz, I cannot find x!");return;}
ans=b/d*x;
s=p/d;
ans=(ans%s+s)%s;
printf("%lld\n",ans);
}
void solve3()
{
y%=p,z%=p;
if(!y)
{
if(!z)puts("");else puts("Orz, I cannot find x!");
return;
}
ll m=ceil(sqrt(p)),v=qpow(y,p-m-),e=,ret;
hsh.clear();
hsh[]=m+;
for(ll i=;i<=m;i++)
{
e=e*y%p;
if(!hsh[e])hsh[e]=i;
}
ret=-;
for(ll i=;i<m;i++)
{
if(hsh[z]){ret=i*m+(hsh[z]==m+?:hsh[z]);break;}
z=z*v%p;
}
if(ret==-)puts("Orz, I cannot find x!");
else printf("%d\n",ret);
}
int main()
{
int T,k;
scanf("%d%d",&T,&k);
while(T--)
{
scanf("%lld%lld%lld",&y,&z,&p);
if(k==)printf("%lld\n",qpow(y,z));
else if(k==)solve2(y,z);
else solve3();
}
}

[SDOI2011]计算器(exgcd&BSGS)的更多相关文章

  1. 【bzoj2242】[SDOI2011]计算器 EXgcd+BSGS

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

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

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

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

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

  4. BZOJ 2242 [SDOI2011]计算器 ——EXGCD/快速幂/BSGS

    三合一的题目. exgcd不解释,快速幂不解释. BSGS采用了一种不用写EXGCD的方法,写起来感觉好了很多. 比较坑,没给BSGS的样例(LAJI) #include <map> #i ...

  5. 【洛谷 P2485】 [SDOI2011]计算器 (BSGS)

    题目链接 第一问:快速幂 第二问:扩欧解线性同余方程 第三问:\(BSGS\) 三个模板 #include <cstdio> #include <cmath> #include ...

  6. 牛客20347 SDOI2011计算器(bsgs

    https://ac.nowcoder.com/acm/problem/20347 这篇是为了补bsgs(北上广深算法). 题意: 1.给定y,z,p,计算Y^Z Mod P 的值:  2.给定y,z ...

  7. [SDOI2011]计算器(BSGS)

    洛古题面 对于操作一,用快速幂算即可 代码如下 int quickpow(int a,int b,int k) { int r=1; while(b) { if(b&1) r=(r*a)%k; ...

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

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

  9. BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS

    BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS 题意: 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p, ...

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

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

随机推荐

  1. 阿里p3c(代码规范,eclipse插件、模版,idea插件)

    阿里p3c 一.说明 代码规范检查插件p3c,是根据<阿里巴巴Java开发手册>转化而成的自动化插件. (高级黑:P-3C“Orion”,反潜巡逻机,阿里大概取p3c先进,监测,发现潜在问 ...

  2. Java Annotation详解 理解和使用Annotation

    系统中用到了java注解: 查了一下如何使用注解,到底注解是什么: (1)创建方法:MsgTrace Java Class==> 在Create New Class中: name:输入MsgTr ...

  3. pycharm 安装

    pycharm 1.模板 file->setting->Editor->file and code template->python script->右上方 #!/usr ...

  4. Bootstrap之图片展示界面Demo2

    代码:(使用模板引擎freemarker) <!DOCTYPE html> <html> <head> <title>图片</title> ...

  5. Python——组图Canvas控制参数

    一.参数说明 background(bg) : 背景色; foreground(fg): 前景色; borderwidth :组件边框宽度: width  : 组件宽度: height  : 高度; ...

  6. NPOI 上传Excel功能(二)

    3.上传文件,写入log using DC.BE.Business.SYS; using DC.BE.Entity.ERP; using DC.BE.Entity.SAS; using DC.BE.E ...

  7. jedis集群版应用

    1.pom文件添加依赖: 2.创建配置文件 <!-- jedis集群版配置(JedisCluster通过构造传参(2个参数)) --> <bean id="redisCli ...

  8. c++ 怎么输出保留2位小数的浮点数

    //添加头文件 #include<iomanip> //定义变量 folat a=9.1; cout<<setiosflags(ios::fixed)<<setpr ...

  9. Nginx 减少磁盘读写次数

    L:133

  10. Maven使用(一)—— Maven的安装与全局配置

    一.Maven安装 Maven的安装步骤: 1.Maven官网(http://maven.apache.org/)下载压缩包,解压缩,当前最新版本是apache-maven-3.5.3-bin.zip ...