【学术篇】SDOI2011 计算器
好一道三合一...(然而被我做成了四合一)
其实1 2 3是独立的OvO
然后就可以逐个分析了...
1
快速幂..就不说了..(我省选的时候有这么水的20pts部分分么←_←
2
两种做法(写在标题里面了)..
2.1(扩展欧几里得)
\(xy\equiv z(mod\ p)\)
很显然可以写成\(xy=np+z\), 移项得\(xy-np=z\)
为保证\(y,p\)互质, 我们让两边同除\(gcd(y,p)\), 也就是让\(y,p,z\)分别除\(gcd(y,p)\)
由扩展欧几里得, 如果\(gcd(y,p)\)不能整除\(z\),那么方程无解...
处理完直接exgcd就行了.. 这样我们就能得到\(xy-np=1\)的解了.. 然后再乘个\(z\)后对p取模即可..
如果结果小于0呢? 我们可以\(+z\),一直加到不再小于0
或者是可以用\(p-(-p)\ mod\ b\)这样的方式来处理...
2.2(费马小定理)
嘛,其实有一个更简单的角度OvO
\(xy\equiv z(mod\) \(p)\) ∴\(x=y^{-1}*z\)
所以我们求个逆元就完了OvO 由于\(p\)是质数, 而\(y\)一定不是\(p\)的倍数所以一定互质...
直接\(x=z*y^{p-2}\)就做完了...
3
BSGS板子...
BSGS算法 原名Baby steps Giant steps算法 又叫大步小步、北上广深、拔山盖世算法...
就是专门用来求对于给定\(y,z\),满足\(y^x\equiv z(mod\ p)\)中的最小的x的方法...
其思路如下:
- 令\(x=i*m-j\)(这里写成减号方便移项), 则\(y^{im-j}\equiv z(mod\ p)\)
- 移项, \(y^{im}\equiv z*y^j(mod\ p)\)
然后我们枚举\(i,j\)即可...
这里的\(m\)我们取\(\left \lceil \sqrt p \right \rceil\)(可能是跟均值不等式有什么不可告人的关系吧??我也不知道)
之后先从\(0\sim m\)枚举\(j\) ,将\(z*y^j\)存到表里...(开map大概就可以了OvO, 记得值相同就覆盖掉, 因为要求\(im-j\)的最小值, 所以要让\(j\)尽量大...)
然后从\(1\sim m\)枚举\(i\) ,如果\(y^{im}\)在表里找到了相等的值, 那就找到了\(x\), 而且\(x\)肯定是最小的..
这样就行了..具体实现可以看代码
代码
今天心情特别好, 所以写代码要压行... 然后这个三合一写了15行OvO
所以就出现了很难看的代码OvO...建议学习代码实现的还是去百度另寻高明吧OvO
#include <map>
#include <cmath>
#include <cstdio>
typedef long long LL;
std::map<LL,int> v;LL T,L,y,z,c;
#define NOANS {puts("Orz, I cannot find x!");return;}
inline LL gn(LL a=0,char c=0){for(;c<48||c>57;c=getchar());for(;c>47&&c<58;c=getchar())a=a*10+c-48;return a;}
LL qpow(LL a,LL b,LL p,LL s=1){for(;b;b>>=1,a=a*a%p)if(b&1) s=s*a%p;return s;}
void B(){y%=c;z%=c;if(z&&!y)NOANS printf("%d\n",z*qpow(y,c-2,c)%c);} //这里用的费马(因为短)
void C(LL m=1,LL x=1,LL p=1){if(y%c==0)NOANS m=sqrt(c)+0.5;x=z;p=qpow(y,m,c);v.clear();
for(LL j=0;j<=m;++j)v[x]=j,x=x*y%c;x=1;
for(LL i=1;i<=m;++i){x=x*p%c;if(v[x]){printf("%lld\n",i*m-v[x]);return;}}
NOANS} //BSGS
void WORK(){T=gn(),L=gn();while(T--){y=gn(),z=gn(),c=gn();if(L==1)printf("%d\n",qpow(y,z,c));if(L==2)B();if(L==3)C();}}
int main(){WORK();}
//LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);}
//void exgcd(LL a,LL b,LL& x,LL& y){!b?x=1,y=0:(exgcd(b,a%b,y,x),y-=(a/b)*x);}
//void B(LL a=0,LL b=0,LL d=0,LL x=0){a=y;b=-c;d=gcd(a,b);if(z%d)NOANS
// a/=d;b/=d;z/=d;exgcd(a,b,x,y);x=x*z%b;if(x<0)x=b-(-x)%b;printf("%d\n",x);
//} //被注释的几行是2.1(扩欧的实现)
【学术篇】SDOI2011 计算器的更多相关文章
- bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...
- BZOJ 2242: [SDOI2011]计算器( 快速幂 + 扩展欧几里德 + BSGS )
没什么好说的... --------------------------------------------------------------------- #include<cstdio&g ...
- BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]
2242: [SDOI2011]计算器 题意:求\(a^b \mod p,\ ax \equiv b \mod p,\ a^x \equiv b \mod p\),p是质数 这种裸题我竟然WA了好多次 ...
- BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS
BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS 题意: 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p, ...
- 【bzoj2242】[SDOI2011]计算器
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3207 Solved: 1258[Submit][Statu ...
- BZOJ2242 [SDOI2011]计算器 【BSGS】
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 4741 Solved: 1796 [Submit][Sta ...
- 【BZOJ2242】[SDOI2011]计算器 BSGS
[BZOJ2242][SDOI2011]计算器 Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ ...
- 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS
[bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...
- 洛谷 P2485 [SDOI2011]计算器 解题报告
P2485 [SDOI2011]计算器 题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最 ...
- P2485 [SDOI2011]计算器
P2485 [SDOI2011]计算器 题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最 ...
随机推荐
- 【Java多线程系列六】Map实现类
Map的一些实现类有及其特性 类 线程安全 特性 Hashtable 是 Key不能为null HashMap 否 读写效率最高,但在Java6多线程环境下使用不当可能陷入死循环,进而导致CPU使用率 ...
- 【Java多线程系列随笔一】浅析 Java Thread.join()
一.在研究join的用法之前,先明确两件事情. 1.join方法定义在Thread类中,则调用者必须是一个线程, 例如: Thread t = new CustomThread(); //这里一般是自 ...
- opencv——常见的操作
一 图像阈值处理 准备一张灰度图像 阈值处理通常是设定一个阈值,让图片的所有像素点的值与其比较做出一系列的操作. 在opencv常用的阈值处理函数有五种,分别是THRESH_BINARY.THRESH ...
- JS 将对象转换成字符 字符串转换成json对象
//js对象 var user = { "name": "张学友", "address": "中国香港" }; //将对 ...
- Flask理论基础(一)视图函数和URL反转函数(url_for)
一.视图函数 1.1 基本用法试图函数是 app.route 或者 bp.route(蓝图)装饰器装饰的函数.该函数实现了对URL路径的转换,也就是路由功能,例如下面代码定义了默认url ‘/’ 和‘ ...
- tomcat nio apr
NIO[root@localhost ~]# vim /usr/local/tomcat9/conf/server.xml<Connector port="8080" pro ...
- PL/SQL Developer 查看查询的执行计划
https://zhuanlan.zhihu.com/p/65771352 通过 PL/SQL Developer 查看查询的执行计划 1 什么是执行计划 执行计划是一条查询语句在 Oracle 中的 ...
- 【JZOJ6411】上网
description analysis 如果把所有大小关系连成边,小的往大的连,就可以直接上拓扑 暴力连边时间复杂度\(O(n^2)\),然而连边的过程,考虑用线段树优化 线段树上的所有儿子节点向父 ...
- CSS四种定位及应用
定位(position) 如果,说浮动, 关键在一个 “浮” 字上面, 那么 我们的定位,关键在于一个 “位” 上. PS: 定位是我们CSS算是数一数二难点的了,但是,你务必要学好它,我们CSS离不 ...
- 理解TCP/IP,SOCKET,HTTP,FTP,RMI,RPC,webservic
TCP/IP:网络宽带,传输数据的基础协议,所有得数据要在网络上传输都是基于TCP/IP协议(或UDP),才能送达到指定的目的地(IP,服务器硬件地址). SOCKET:SOCKET只是面对编程人员的 ...