博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 2242: [SDOI2011]计算器
阅读量:5080 次
发布时间:2019-06-12

本文共 1288 字,大约阅读时间需要 4 分钟。

Description

你被要求设计一个计算器完成以下三项任务:

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)的最小非负整数。

Solution

打个 \(BSGS\) 板子

\(x=a*m-b\)
原式变为 \(y^{a*m}=z*y^b\,\,(mod P)\)
枚举 \(b=[0,m-1]\) 求出所有的取值,并存下来
再枚举 \(a\) ,查找右边是否有出现过,由欧拉定理: \(a\) 不会超过 \(\frac{P}{m}\)
\(y\%P==0\) 时且 \(P>1\) 时无解,特判一下
\(m=sqrt(P)\) 时,复杂度最优

#include
#define int long longusing namespace std;int mod;inline int qm(int x,int k){ int sum=1; while(k){ if(k&1)sum=1ll*sum*x%mod; x=1ll*x*x%mod;k>>=1; } return sum;}inline int exgcd(int a,int b,int &x,int &y){ if(!b){x=1;y=0;return a;} int r=exgcd(b,a%b,y,x);y-=a/b*x; return r;}inline void solo(int a,int b,int c){ int x,y,r; r=exgcd(a,b,x,y); if(c%r){puts("Orz, I cannot find x!");return ;} x*=c/r;b/=r; x=(x%b+b)%b; cout<
<
a;inline void bsgs(int y,int z){ y%=mod;z%=mod; if(z==1){puts("0");return ;} if(y%mod==0){ if(mod>1)puts("Orz, I cannot find x!"); else puts("0"); return ; } a.clear(); int t=sqrt(mod),e=qm(y,t); for(int i=0;i
>T>>K; while(T--){ cin>>y>>z>>mod; if(K==1)cout<
<

转载于:https://www.cnblogs.com/Yuzao/p/8977753.html

你可能感兴趣的文章
hammer.js
查看>>
LeetCode #151 Two Sum
查看>>
VM Fusion配置静态IP和物理机通讯
查看>>
数据仓库小记(二)
查看>>
【S】SQL SERVER检查临时表占用空间情况
查看>>
mybatis入门(八)
查看>>
springboot+mybatisplus+lombook项目中数据问题。
查看>>
SQL server知识点
查看>>
Promise/Bluebird源码
查看>>
000webhost虚拟主机绑定自定义二级域名
查看>>
C语言基础
查看>>
Class.forName的作用以及为什么要用它【转】
查看>>
做技术,切不可沉湎于技术
查看>>
js调试系列: 调试基础与技巧
查看>>
Redis Getshell总结
查看>>
模板方法模式
查看>>
移动构造函数和移动赋值与拷贝构造函数和赋值构造函数的比较
查看>>
Solr 开发环境搭建
查看>>
【泡泡机器人公开课预告】刘艺博-三维视觉与深度学习
查看>>
Video Processing
查看>>