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 ...
随机推荐
- 基于mybatis设计简单信息管理系统---jsp页面
1.在设计编辑界面的时候需要有一个下拉的列表页,想要他指定到指定的值: <select id="categoryId" name="categoryId" ...
- Thinkphp 取消Url默认模块的现实
例子http://www.tp.com/home/index/index 想要现实的效果是:http://www.tp.com/index/index 1是通过配置路由来达到目的 2通过配置首页的入口 ...
- linux常见内核参数
参数 描述 net.ipv4.ip_forward 接口间转发报文net.ipv4.tcp_tw_reuse 表示是否允许将处于 TIME-WAIT 状态的 socket (TIME-WAIT 的端口 ...
- 特殊sql查询方法实例
一.if条件查询:SELECT sum(if(is_buy > 0 ,1,0)) AS friend_count_all_cj, sum(if(is_buy = 0 ,1,0)) AS frie ...
- sql语句(Oracle和sqlserver)
查询表的首句:(Oracle) select * from (select a.*, rownum as rn from tab_name a order by col )where rn = 1 o ...
- acm总结
注意事项: 不要轻易中途变换思路修改代码 发现有样例无法通过可以用if强行通过 注意输入输出形式(long long为lld,无符号为llu). 开过1亿的int型数组 Long long能读入输出1 ...
- Background Segment CNT
CNT简介 CNT算法是OpenCV Contrib 模块中的背景减除(Background segment)算法之一.相较于OpenCV提供的其他背景减 除算法,该算法具有运行速度快,检测精度高等优 ...
- [BZOJ3714]Kuglarz(最小生成树)
Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,-,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费\(C_{i,j}\)元,魔术师就会告诉 ...
- Hive 中的 UDF
LanguageManual UDF 一.分类 UDF:User defined function 用户定义函数 一进一出 UDAF:User defined aggregation function ...
- java程序——随机数求和
设计思路:用随机算法随机生成10个数(0~100),循环填充一个数组,然后在循环中显示数组内容,接着用一个循环计算数组元素的和,将结果也显示在消息框中. 流程图: 源代码: package test; ...