POJ2417 Discrete Logging | A,C互质的bsgs算法
题目:
给出A,B,C
求最小的x使得Ax=B (mod C)
题解:
bsgs算法的模板题
bsgs 全称:Baby-step giant-step
把这种问题的规模降低到了sqrt(n)级别
首先B的种类数不超过C种,结合鸽巢原理,所以Ax具有的周期性显然不超过C
所以一般的枚举算法可以O(C)解决这个问题
但是可以考虑把长度为C的区间分为k块,每块长度为b
显然x满足x=bi-p的形式(1<=i<=k,0<=p<b),所以Ax=B (mod C)移项之后得到Abi=Ap*B (mod C)
那么这个时候可以预处理出来Ap的所有值(可以用hash表维护)
//注意!hash表在插入之前要先找有没有这个值,如果有的话直接把改了就好
处理出Ab的值,枚举i,就可以得到答案
一般来说令k=b=sqrt(C)时间复杂度最优
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#define MOD 1000007
#define EDGE 500000
typedef long long ll;
using namespace std;
ll c,a,b,ok,m,tmp,t,ans,head[MOD],ecnt;
struct adj
{
ll nxt,w,sum;
}e[EDGE];
void add(ll x,ll sum)
{
ll org=x;
e[++ecnt].w=x;
x%=MOD;
for (int i=head[x];i;i=e[i].nxt)
if (e[i].w==org)
{
e[i].sum=sum;
return ;
}
e[ecnt].sum=sum;
e[ecnt].nxt=head[x];
head[x]=ecnt;
}
ll qow(ll x,ll y,ll P)
{
if (y==) return ;
if (y&) return x*qow(x*x%P,y>>,P)%P;
return qow(x*x%P,y>>,P)%P;
}
ll find(ll x)
{
ll org=x;
x%=MOD;
for (int i=head[x];i;i=e[i].nxt)
{
if (e[i].w==org)
return e[i].sum;
}
return -;
}
int main()
{
while (scanf("%lld%lld%lld",&c,&a,&b)!=EOF)
{
memset(head,,sizeof(head));
ecnt=;
ok=;
if (a%c==)
{
puts("no solution");
continue;
}
m=ceil(sqrt(c*1.0));
tmp=b%c,add(tmp,);
if (b==)
{
printf("0\n");
continue;
}
for (int i=;i<m;i++)
{
tmp=tmp*a%c;
add(tmp,i);
}
ll base=qow(a,m,c),tmp=;
for (int i=;i<=m;i++)
{
tmp=tmp*base%c;
ans=find(tmp);
if (ans!=-)
{
printf("%lld\n",i*m-ans);
ok=;
break;
}
}
if (!ok)
puts("no solution");
}
return ;
}
POJ2417 Discrete Logging | A,C互质的bsgs算法的更多相关文章
- POJ2417 Discrete Logging【BSGS】
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5577 Accepted: 2494 ...
- [POJ2417]Discrete Logging(指数级同余方程)
Discrete Logging Given a prime P, 2 <= P < 2 31, an integer B, 2 <= B < P, and an intege ...
- POJ2417 Discrete Logging
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- POJ2417 Discrete Logging【BSGS】(模板题)
<题目链接> 题目大意: P是素数,然后分别给你P,B,N三个数,然你求出满足这个式子的L的最小值 : BL== N (mod P). 解题分析: 这题是bsgs算法的模板题. #incl ...
- poj2417 Discrete Logging BSGS裸题
给a^x == b (mod c)求满足的最小正整数x, 用BSGS求,令m=ceil(sqrt(m)),x=im-j,那么a^(im)=ba^j%p;, 我们先枚举j求出所有的ba^j%p,1< ...
- Discrete Logging ZOJ - 1898 (模板题大小步算法)
就是求Ax三B(mod C)当C为素数时 #include<cstdio> #include<cstring> #include<cmath> #include&l ...
- Discrete Logging(poj2417)
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5120 Accepted: 2319 ...
- [poj2417]Discrete Logging_BSGS
Discrete Logging poj-2417 题目大意:求$a^x\equiv b(mod\qquad c)$ 注释:O(分块可过) 想法:介绍一种算法BSGS(Baby-Step Giant- ...
- poj 2417 Discrete Logging ---高次同余第一种类型。babystep_gaint_step
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2831 Accepted: 1391 ...
随机推荐
- HDU.2561 第二小整数(water)
题目来源:2561 题意分析:找出一堆数中第二小的整数,和题目说的一样 我的思路:冒泡或者sort()一下就ok了,但是我因为没看到多个测试用例还是吃了几记WA . ┭┮﹏┭┮ 完整代码: #incl ...
- 谈谈两种标准库类型---string和vector
两种最重要的标准库---string和vector string和vector是两种最重要的标准库类型,string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列. 一.标准库 ...
- Spring Cloud 入门 Consul-Server服务注册
前面见过 Eureka服务注册,需要单独启用一个springboot项目 :这里介绍一个 spring cloud consul 服务, 只需要安装相关客户端,启动它就行: 1.安装Consul(以 ...
- 原生js关闭窗口
if (navigator.userAgent.indexOf("MSIE") > 0) { if (navigator.userAgent.indexOf("MS ...
- px与em的区别,权重的优先级
px与em的区别,权重的优先级 PX特点:px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的.EM特点:1. em的值并不是固定的:2. em会继承父级元素的字体大小. 权重 ...
- PHP 日期处理函数 date() 、mktime()
一.前言 php是世界上最好的语言! 二.介绍 mktime()函数获取当周\当天\当月 /** * 微程-日期工具函数 week: 当周 day: 当天 month: 当月 * @author 狗蛋 ...
- 实例讲解如何利用jQuery设置图片居中放大或者缩小
大家有没有见过其他网站的图片只要鼠标放上去就能放大,移出去的时候就能缩小,而且一直保持居中显示!其实jQuery提供一个animate函数可以使图片放大和缩小,只要改变图片的长和高就OK啦!但是ani ...
- 超简单开发自己的php框架一点都不难
(转)https://blog.csdn.net/qq_33862644/article/details/79344331 写框架的极简思路: 接收,打印参数想怎么弄.如 获取配置文件的方法,根据传过 ...
- 裸机——iNand
1.先晓得iNand的基础知识 iNand是在SD卡基础上发展来的,而SD卡是在MMC的基础上发展来的,MMC是在Nand的基础上发展来的 我们晓得Nand的基础知识,而MMC对Nand大致做了两个改 ...
- 开放定址法——线性探测(Linear Probing)
之前我们所采用的那种方法,也被称之为封闭定址法.每个桶单元里存的都是那些与这个桶地址比如K相冲突的词条.也就是说每个词条应该属于哪个桶所对应的列表,都是在事先已经注定的.经过一个确定的哈希函数,这些绿 ...