题意

给定 \(y,z,p\),求最小的正整数 \(x\) 满足 \(y^x\equiv z\bmod p\),保证 \(p\) 是质数。

\(\texttt{Data Range:}2\leq y,z<p<^{31}\)

题解

BSGS 裸题。

这题其实我一年前就做过了,但是现在发现差点背不得 BSGS 了,所以重新写了一遍。

背 BSGS 其实只要掌握原理就好了。

首先考虑分块。令 \(x=am-b,m=\sqrt{p}\),那么就有

\[y^{am}\equiv zy^b\pmod p
\]

注意到由于 \(b\) 只有 \(\sqrt{b}\) 种取值方法,所以可以将所有可能的 \(zy^b\) 拿个哈希表存下来。

然后枚举 \(a\),暴力查 \(y^{am}\) 在哈希表里有没有对应的值就好了。

代码

#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=2e5+51;
unordered_map<ll,ll>hsh;
ll x,y,MOD,res;
inline ll read()
{
register ll num=0,neg=1;
register char ch=getchar();
while(!isdigit(ch)&&ch!='-')
{
ch=getchar();
}
if(ch=='-')
{
neg=-1;
ch=getchar();
}
while(isdigit(ch))
{
num=(num<<3)+(num<<1)+(ch-'0');
ch=getchar();
}
return num*neg;
}
inline ll qpow(ll base,ll exponent)
{
ll res=1;
while(exponent)
{
if(exponent&1)
{
res=(li)res*base%MOD;
}
base=(li)base*base%MOD,exponent>>=1;
}
return res;
}
inline ll find(ll x)
{
return hsh.find(x)==hsh.end()?-1:hsh[x];
}
inline ll BSGS(ll base,ll res)
{
ll blk=sqrt(MOD)+1,v=(res%=MOD),x;
hsh.clear(),base%=MOD;
for(register int i=0;i<=blk;i++)
{
hsh[v]=i,v=(li)v*base%MOD;
}
base=qpow(base,blk),v=1;
if(!base)
{
return !res?1:-1;
}
for(register int i=0;i<=blk;i++)
{
x=find(v),v=(li)v*base%MOD;
if(x>=0&&i*blk-x>=0)
{
return i*blk-x;
}
}
return -1;
}
int main()
{
MOD=read(),x=read(),y=read(),res=BSGS(x,y);
res==-1?puts("no solution"):printf("%d\n",res);
}

最新文章

  1. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析
  2. MySql索引简介
  3. Bootstrap学习笔记系列1-------Bootstrap网格系统
  4. Semantic-UI和其他几个前端框架
  5. Linux下修改网卡的mac地址
  6. Java中的Property类
  7. uva 796 Critical Links(无向图求桥)
  8. Android Timer用法
  9. Android adb opendir failed ,permission denied
  10. BZOJ 1012 最大数
  11. KVM客户机使用主机USB设备
  12. 第十二章——SQLServer统计信息(3)——发现过期统计信息并处理
  13. Thymeleaf 笔记
  14. 使用Go和Let&#39;s Encrypt证书部署HTTPS
  15. Exception:两个类具有相同的 XML 类型名称,请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称
  16. idea 迁移maven项目出现导入仓库半天没反应的问题解决
  17. 替换linux系统文件etc下passwd文件的字段获取真正的root权限
  18. [转]Redis 数据类型
  19. JS_正则表达式_验证中文字符
  20. vue cli 3 +jquery

热门文章

  1. gRPC-Protocol语法指南
  2. Linux里面的压缩和解压类指令
  3. python3的基础数据类型
  4. IPV6介绍已经IPV6改造基本步骤
  5. Typore的简单用法
  6. 【题解】Bzoj3916
  7. DX12龙书 00 - 环境配置:通过 Visual Studio 2019 运行示例项目
  8. 系统架构设计:平滑发布和ABTesting
  9. 动态枢轴网格使用MVC, AngularJS和WEB API 2
  10. 自定义Antd Pro 默认元素