BZOJ 5296: [Cqoi2018]破解D-H协议(BSGS)
2024-09-05 23:13:51
解题思路
\(BSGS\)裸题??要求的是\(g^a =A (mod\) \(p)\),设\(m\)为\(\sqrt p\),那么可以设\(a=i*m-j\),式子变成
$$ g^{i*m-j}=A\mod p$$
然后把\(j\)移过去,
$$g{i*m}=A*gj\mod p$$
然后可以预处理枚举\(j\)的值用哈希存下来,每次直接\(O(m)\)询问,总的时间复杂度为\(O(T\sqrt p \log)\)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#define int long long
using namespace std;
typedef long long LL;
int g,MOD,T,A,B,a,b,m;
map<int,int> mp;
inline int fast_pow(int x,int y){
int ret=1;
for(;y;y>>=1){
if(y&1) ret=1ll*ret*x%MOD;
x=1ll*x*x%MOD;
}
return ret;
}
inline void prework(){
m=ceil(sqrt(MOD));
int base=fast_pow(g,m),now=1;
mp[now]=0;
for(int i=1;i<=m;i++){
now=1ll*now*base%MOD;
mp[now]=i;
}
}
inline int BSGS(int x){
int now=x;
if(mp.count(now)) return mp[now]*m;
for(int i=1;i<=m;i++){
now=1ll*now*g%MOD;
if(mp.count(now)) return mp[now]*m-i;
}
}
signed main(){
scanf("%lld%lld%lld",&g,&MOD,&T);
prework();
while(T--){
scanf("%lld%lld",&A,&B);
a=BSGS(A); b=BSGS(B);
a=(a%(MOD-1)+MOD-1)%(MOD-1);
b=(b%(MOD-1)+MOD-1)%(MOD-1);
printf("%lld\n",fast_pow(g,1ll*a*b%(MOD-1)));
}
return 0;
}
最新文章
- pdsh使用
- C# 基础(7)--线程
- Linux学习进阶路线图
- nginx支持flv MP4 扩展nginx_mod_h264_streaming,nginx-rtmp-module-master,yamdi
- requirejs 优化压缩
- js中 的这些距离你知道吗?
- ThinkPHP 自动验证与自动填充无效可能的原因
- 图片的css自适应
- 【Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款/蓝绿色】玛萨玛索男装网购商城
- python获取实时股票信息
- 【Python】@property的用法
- 项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】
- 业务零影响!如何在Online环境中巧用MySQL传统复制技术【转】
- table标签中thead、tbody、tfoot的作用
- java 使用https协议,cas认证PKIX path building failed错误解决方法
- C#技术点--修改系统时间
- PYTHON-进程 子进程
- 【Android】自动测试工具 Monkey
- 8. Security-oriented operating systems (面向安全的操作系统 5个)
- 表单,table的css
热门文章
- php面向对象的重写与重载
- 测开之路八十一:参数定义之*args和**kwargs
- STM32 HAL库关于串口中断烧录程序后可以正常运行,断电重启后无法进入中断的问题分析以及解决方法
- ECMAScript 2015 可迭代协议:迭代普通对象
- HDU 2512 一卡通大冒险 (第二类斯特林数)
- 关于VMware中的几个网络模式
- app本身性能测试简介
- [HDU5807] [BestCoder Round #86 1004] Keep In Touch (DP)
- CF208E Blood Cousins
- bat ini文件读取