题意:

给定x,n,m,求x^y=n(mod m)的解(其中m是素数)

求解一个最小的x满足给定的方程Bx == N (mod P)

使用baby_step_giant_step算法。也就是先小步后大步算法。

1、令x=i*m+j  (m=ceil(sqrt(p))),

那么原式化为 B^(i*m)*B^j==N(MOD P)

B^j==N*B^(-i*m)(MOD P)---------->B^j==N*B^m^(-i)(MOD P)

2、先预处理B^0,B^1,B^2……B^(m-1),存入HASH表,我使用结构体排序然后二分查找,这一步就是baby_step,每次移动1

3、然后快速幂求出B^-m,枚举i,如果存在N*B^(-i*m)存在于HASH表中,说明存在解x=i*m+j,这一步为giant_step,每次移动m

注意以上解法是最基本的,只能对于gcd(B,P)==1,算法的时间复杂度是O(sqrt(P)*log(sqrt(P)))

模板:此模板m不一定非为质数

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;ll b,n,p;
/***************************************/下面就是BSGS的函数集,包括所需变量
const int N=100009;
const int mod=76543;
ll hs[N],id[N],head[N],next[N],tot;
void insert(ll x,ll y)
{int k=x%mod;hs[++tot]=x;id[tot]=y;next[tot]=head[k];head[k]=tot;
}
ll find(ll x)
{int k=x%mod;for (int i=head[k];i;i=next[i])if (hs[i]==x) return id[i];return -1;
}
ll BSGS(ll a,ll b,ll n)
{if (b==1) return 0;memset(head,0,sizeof(head));tot=0;ll j,m=sqrt(n*1.0),x=1,p=1;for (int i=0;i<m;i++,p=p*a%n) insert(p*b%n,i);for (ll i=m;i<=n;i+=m)if ((j=find(x=x*p%n))!=-1) return i-j;return -1;
}
/**************************************/
int main()
{while(scanf("%lld%lld%lld",&p,&b,&n)!=EOF)//poj提交一定要有“!=EOF”      !!!!!!!!!{ll ans=BSGS(b,n,p);if (ans==-1) printf("no solution\n");else printf("%lld\n",ans);} return 0;
}

离散对数(例题+详解+代码模板)相关推荐

  1. 平方剩余(例题+详解+代码模板)

    平方剩余 (poj 1808) 题意: 判断平方剩余,即判断(x^2)%p=a是否有解. 限制: |a| <= 1e9 && a % p !=0; 2 < p < 1 ...

  2. 算术编码例题详解_百分数与百分点区别详解

    通过以往的答疑经验,许多同学对于出现百分点的材料和题目不能够很好的百分点与已知百分数之间的关系.那么百分数与百分点的核心区别在哪里?常见题型中出现的百分数与百分点应该如何进行理解应用? 百分数与百分点 ...

  3. dijkstra标号法表格_标号法求最短路径例题详解.ppt

    标号法求最短路径例题详解 r * 最短路径 带权图G=, 其中w:E?R. ?e?E, w(e)称作e的权. e=(vi,vj), 记w(e)=wij . 若vi,vj不 相邻, 记wij =?. 设 ...

  4. 马氏距离例题详解(全网最详细)

    马氏距离例题详解 定义 马哈拉诺比斯距离是由印度统计学家马哈拉诺比斯 (英语)提出的,表示数据的协方差距离.它是一种有效的计算两个未知样本集的相似度的方法.与欧氏距离不同的是它考虑到各种特性之间的联系 ...

  5. nacl溶解度_科普下氯化钠溶解度(含例题详解)

    关于到现在氯化钠溶解度(含例题详解)这个话题,相信很多小伙伴都是非常有兴趣了解的吧,因为这个话题也是近期非常火热的,那么既然现在大家都想要知道氯化钠溶解度(含例题详解),小编也是到网上收集了一些与氯化 ...

  6. 分治算法小结(附例题详解)

    分治算法小结(附例题详解) 我的理解: 分治算法我的理解就是看人下菜碟,我们要解决的问题就好像一群人构成的集体,要我们解决这个问题,那我们就要满足这群人里面每个人不同的需求,也就是写出解决的代码,把每 ...

  7. 小数加分数怎样计算讲解_干货!整数、小数、分数怎么计算更简便?含例题详解...

    原标题:干货!整数.小数.分数怎么计算更简便?含例题详解 小学数学中,一直贯穿着一个内容,那就是简便运算.在整数范围.小数范围.分数范围内都做为一个内容重复出现.而这个内容也正是小学数学中的一个难点. ...

  8. 调度算法-优先级调度算法+例题详解

    1. 优先级调度算法的类型 优先级进程调度算法,是把处理机分配给就绪队列中优先级最高的进程.这时,又可进一步把该算法分成如下两种. 非抢占式优先级调度算法. 抢占式优先级调度算法. 2. 优先级的类型 ...

  9. 复向量的内积(例题详解)

    复向量内积例题详解 定义 设x,y∈Cnx,y \in C^nx,y∈Cn,其内积 (x,y)=x1y1‾+x2y2‾+...+xnyn‾=∑i=1nxiyi‾(x,y) = x_1 \overlin ...

最新文章

  1. Mac上 如何快速玩起rocksdb
  2. 鸿蒙2.0操作体验,鸿蒙2.0操作系统正式版-华为鸿蒙2.0操作系统正式版官方预约 v1.0.0-优盘手机站...
  3. 成功解决ValueError: With n_samples=0, test_size=0.3 and train_size=None, the resulting train set will be
  4. python实现非对称加密算法_Python3非对称加密算法RSA实例详解
  5. 2021-07-23 小记
  6. 计算机学院足球队 英语怎么说,计算机学院举办2018届毕业生足球赛
  7. 嵌入式C/C++开发过程中日志输出的一点思考
  8. Java基础学习总结(69)——匿名内部类与Lambda表达式
  9. K3 WISE修改单据表头字段默认值
  10. 电商后台管理系统分享
  11. 自定义video标签的大小
  12. 计算机怎么恢复初始设定模式,电脑的Edge浏览器怎么进行重置使其恢复出厂默认设置...
  13. Android中的常用控件之进度条(ProgressBar)
  14. saas平台 saas服务 什么是saas
  15. 有可以在家做的赚钱兼职吗?
  16. 自从用了这个良心浏览器后,我卸载了UC,太香了
  17. 操作系统:磁盘的移臂调度算法
  18. 10Easyx图形编程
  19. 闲扯Maven项目代码组织形式
  20. 春招必看一位老学长的真实互联网校招求职心路历程~

热门文章

  1. 多个php 链接数据库,ThinkPHP实现多数据库连接的解决方法
  2. python怎么设置代码执行时间_python 代码运行时间获取方式详解
  3. mouted vue 操作dom_vue中关于dom的操作
  4. java 文件通道_Java NIO(四)文件通道
  5. ec20驱动_物联网基础:移远EC20固件升级
  6. html无法引入less样式,@import less样式文件 只有css样式生效, less样式却不生效
  7. 常用的python测试脚本_详解Python的单元测试
  8. bootstrap table格式化字符串_你要的PHP字符串处理函数都在这了!
  9. python在数字后添加字符_Python在字符前后补字符
  10. maven 镜像_Maven(一)