https://ac.nowcoder.com/acm/problem/20347

这篇是为了补bsgs(北上广深算法)。

题意:

1、给定y,z,p,计算Y^Z Mod P 的值; 
2、给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数;
3、给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数。
 
思路:
1.当然是裸的快速幂取模啦。
2.原式<=>yx+pk=z有解,exgcd记录d=gcd(y,p),看是否d|z即可。
3.要求满足形如a^x ≡ b (mod p)的最小非负整数x。
由周期性只需在[0,p)讨论即可,证明的话,抽屉原理显然,或者由费马小定理(  当p为质数且(a,p)=1时 a^(p-1)=1 (mod p)  )能推出a^k=a^(k mod (p-1)) (mod p)。
把x分块,每块长度是m,其中m=ceil(sqrt(p)),则a^(i*m-j) = b (mod p),移项得a^(i*m) = b*a^j (mod p)
枚举j(范围0-m),将b*a^j存入哈希表。
枚举i(范围1-m),从哈希表找出第一个满足a^(i*m) = b*a^j (mod p)的i
此时x = i*m-j就是答案
时间复杂度O(m+p/m),m取√p时最优。
 
 #include<bits/stdc++.h>
using namespace std;
#define int long long
int T,k,a,b,p;
map<int,int>mp; int kuai(int a,int b,int mod)
{
if(b==)return a;
int x=kuai(a,b/,mod);
if(b%==)return x*x%mod;
else return x*x%mod*a%mod;
} void exgcd(int a,int b,int &d,int &x,int &y)
{
if(b==){d=a;x=;y=;}
else{exgcd(b,a%b,d,y,x);y-=x*(a/b);}
} int bsgs(int a,int b,int p){
a%=p;b%=p;
if(!a&&!b) return ;
if(!a||!b) return -;
mp.clear();
int m = ceil(sqrt(1.0*p)),tmp=;
mp[tmp*b%p]=;
for(int j=;j<=m;j++){
tmp = tmp*a%p;
if(!mp[tmp*b%p]) mp[tmp*b%p] = j;
}
int t = ,ans;
for(int i=;i<=m;i++){
t=t*tmp%p;
if(mp[t]){
ans = i*m-mp[t];
return (ans%p+p)%p;
}
}
return -;
} signed main(){ scanf("%lld%lld",&T,&k);
while(T--)
{
scanf("%lld%lld%lld",&a,&b,&p);
if(k==)printf("%lld\n",kuai(a,b,p)%p);
else if(k==)
{
int x=,y=,d;
exgcd(a,p,d,x,y);
if(b%d)
{
puts("Orz, I cannot find x!");
continue;
}
x=x*b/d;
x=(x%p+p)%p;
printf("%lld\n",x);
}
else{
int ans=bsgs(a,b,p);
if(ans==-)puts("Orz, I cannot find x!");
else printf("%lld\n",ans);
}
}
return ;
}

牛客20347 SDOI2011计算器(bsgs的更多相关文章

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

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

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

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

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

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

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

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

  5. bzoj2242 [SDOI2011]计算器——BSGS

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2242 第一次写BSGS,参考了好多好多博客: 然而看到的讲解和模板是一种写法,这道题的网上题 ...

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

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

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

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

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

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

  9. BZOJ 2242 / Luogu P2485 [SDOI2011]计算器 (BSGS)

    type 1type\ 1type 1 就直接快速幂 type 2type\ 2type 2 特判+求逆元就行了. type 3type\ 3type 3 BSGS板 CODE #include< ...

随机推荐

  1. Python中的inf与nan

    Python中可以用如下方式表示正负无穷 >>> float('inf') # 正无穷,inf不区分大小写,float('InF')一样可以. inf >>> fl ...

  2. zabbix监控WEB网站性能

    一直在纠结用什么实例来给大家演示呢?想来想去还是官方的好,那我们怎么用zabbix监控web性能和可用性呢?我们这边分为几个步骤:打开网站.登陆.登陆验证.退出,一共4个小step,看实例. 检测流程 ...

  3. Java性能权威指南读书笔记--之二

    新生代填满时,垃圾收集器会暂停所有的应用线程,回收新生代空间.这种操作被称为Minor GC. 老年代被填满时,垃圾收集器会暂停所有应用线程,对其进行回收,接着对堆空间进行整理.这个过程被称为Full ...

  4. 爬虫获取搜狐汽车的配置信息 和swf动态图表的销量数据-------详细教学

    前情提要:需要爬取搜狐汽车的所有配置信息,具体配置对应的参数. 以及在动态图表上的历史销量. 比如: 一汽奥迪旗下Q5L 的<40 TFSI 荣享进取型 国VI >的历史销量和该配置的参数 ...

  5. 自练Eclipse搭建SSH全自动注解博客项目笔记

    1.创建一个动态的java项目 2.导入搭建所需要的jar包 3.配置web.xml文件 1).头文件 2).struts2的拦截器 3).定位加载Spring容器的配置文件 4).监听 5). 6) ...

  6. leetcode并发题目解题报告JAVA版

    一.Print in Order Suppose we have a class: public class Foo { public void first() { print("first ...

  7. [Short-Circuit Constraint Violation]警告解决办法

    今天用Altium Designer16画PCB时候遇到一个问题,进行DRC检测,警告如下: [Short-Circuit Constraint Violation] GrayscaleSensor1 ...

  8. Java连载11-转义字符&整数型

    一.转义符 1.\'代表单引号:\\代表\; 二.native2ascii.exe JDK中自带的native2ascii.exe命令,可以将文字转换成unicode编码形式 我们使用这个程序尝试一下 ...

  9. java-web调用后台下载方法

    后台下载指定文件必定会用到流, 无论使用poi还是使用jxl导出excel都需要用到流一种是outputstrean,另一种fileoutputstream第一种:如果想要弹出保存的提示框必须加入下列 ...

  10. Java高级面试题解析(二):百度Java面试题前200页(精选)

    基本概念 操作系统中 heap 和 stack 的区别 heap是堆,stack是栈,是两种不同的数据结构.堆是队列优先,先进先出:栈是先进后出. 在java多线程中,每个线程都有自己的栈:不同的线程 ...