本题是一道 \(BSGS\) 裸题,用于求解高次同余方程,形如 \(a^x\equiv b(\mod p)\),其中 \(a\),\(p\) 互质(不互质还有 \(EXBSGS\))。

建议多使用 \(HASH\) 表,不要懒省事使 \(map\),数据大时会 \(T\) 飞。

\(AC \kern 0.4emCODE:\)

#include<bits/stdc++.h>
#define int long long
#define ri register int
#define p(i) ++i
#define H(x) ((x)%P+1)
using namespace std;
const int P=65537;
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
struct HASH{
struct Hash{
int v,nxt,w;
}H[P+7];
int first[P+7],t;
inline void init() {memset(first,0,sizeof(first));t=1;}
inline void add(int v,int w) {
int u=H(v);
H[t].v=v;
H[t].w=w;
H[t].nxt=first[u];
first[u]=t++;
}
inline int find(int v) {
int u=H(v);
for (ri i(first[u]);i;i=H[i].nxt) if (H[i].v==v) return H[i].w;
return -1;
}
}H;
inline int fpow(int x,int y,int p) {
int res=1;
while(y) {
if (y&1) res=res*x%p;
x=x*x%p;y>>=1;
}
return res;
}
inline int BSGS(int a,int b,int p) {
H.init();b%=p;
int t=ceil(sqrt(p));//注意这里,ceil(sqrt(p))与sqrt(p)+1没什么区别,但后者会WA,有可能是数据有锅,p非质数了。
for (ri i(0);i<=t;p(i)) H.add(b,i),b=b*a%p;
int c=1;a=fpow(a,t,p);
if (!a) return !b?1:-1;
for (ri i(0);i<=t;p(i)) {
int j=H.find(c);
if (j>=0&&i*t-j>=0) return i*t-j;
c=c*a%p;
}
return -1;
}
signed main() {
int p,a,b;
while(scanf("%lld",&p)!=EOF) {
a=read(),b=read();
int ans=BSGS(a,b,p);
if (ans==-1) printf("no solution\n");
else printf("%lld\n",ans);
}
return 0;
}

题解 UVA10225 Discrete Logging的更多相关文章

  1. 【BSGS】BZOJ3239 Discrete Logging

    3239: Discrete Logging Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 729  Solved: 485[Submit][Statu ...

  2. 【BZOJ3239】Discrete Logging BSGS

    [BZOJ3239]Discrete Logging Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B ...

  3. [POJ2417]Discrete Logging(指数级同余方程)

    Discrete Logging Given a prime P, 2 <= P < 2 31, an integer B, 2 <= B < P, and an intege ...

  4. poj 2417 Discrete Logging ---高次同余第一种类型。babystep_gaint_step

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2831   Accepted: 1391 ...

  5. BSGS算法+逆元 POJ 2417 Discrete Logging

    POJ 2417 Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4860   Accept ...

  6. POJ 2417 Discrete Logging (Baby-Step Giant-Step)

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2819   Accepted: 1386 ...

  7. POJ2417 Discrete Logging【BSGS】

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5577   Accepted: 2494 ...

  8. Discrete Logging

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5865   Accepted: 2618 ...

  9. BSGS 扩展大步小步法解决离散对数问题 (BZOJ 3239: Discrete Logging// 2480: Spoj3105 Mod)

    我先转为敬? orz% miskcoo 贴板子 BZOJ 3239: Discrete Logging//2480: Spoj3105 Mod(两道题输入不同,我这里只贴了3239的代码) CODE ...

随机推荐

  1. ROS踩坑笔记总结

    2019-07-12 11:32:16 我的第一篇原创博客(当然是站在巨人肩膀上,有些内容参考了其他大神的博客,都一一做了说明),这些是我之前在学习ROS期间经历的一些坑,以及相对应的解决方案,希望可 ...

  2. asp.net mvc中的路由

    [Route] 路由 [Route("~/")] 忽略路由前缀 [Route("person/{id:int}")] 路由内联约束 [Route("h ...

  3. Python小白的数学建模课-B4. 新冠疫情 SIR模型

    Python小白的数学建模课-B4. 新冠疫情 SIR模型 传染病的数学模型是数学建模中的典型问题,常见的传染病模型有 SI.SIR.SIRS.SEIR 模型. SIR 模型将人群分为易感者(S类). ...

  4. ARTS第十周

     之前忘了发布 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享一篇有观点和思考的 ...

  5. DNS配置【正向解析】

    DNS配置.正向解析                一.BIND域名服务基础                  1)DNS的定义                  2)域名结构             ...

  6. python 操作word

    pip install python.docx from docx import DocumentDoc = Document() 解释:from 从 docx这个文件中,导入一个叫Document的 ...

  7. IDA 修改后保存

    关键点找到了.把 jz short loc_10004753 改成jnz short loc_10004753即可. IDA->edit->Patch program->Assemb ...

  8. final修饰符(2)

    final局部变量 系统不会对局部变量进行初始化,局部变量必须又程序员显示初始化,因此使用final修饰局部变量,可以在声明时指定默认值,也可以在后面的代码中对该final变量赋初始值,但只能赋值一次 ...

  9. 开源协同办公平台部署教程:O2OA PAAS平台部署

    一.镜像制作1.将安装介质o2server-5.0.3-linux.zip上传至镜像制作服务器上.(上传目录为/paas/xxhpaas/moka/o2oa)2.使用unzip命令解压安装包,参考命令 ...

  10. Linux用户提权管理方案

    提权管理方案背景: 如果一个公司有10余个运维或网络安全人员,同时管理服务器,切换到管理员用户时(su - root),必须要有root管理员密码,如果其中一人修改过root密码,其他用户则登录不了, ...