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 ...
随机推荐
- Friendly Date Ranges-freecodecamp算法题目
Friendly Date Ranges 1.要求 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 ...
- ES6编程规范
andre es6 js
- Ansible学习 Patterns
Ansible中ad-hoc命令格式如下:ansible <pattern_goes_here> -m <module_name> -a <arguments>,P ...
- 解决方法:SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正(转载)
引用:http://luowei1371984.blog.163.com/blog/static/44041589201491844323885/ SQL2008运行select count(*) f ...
- Python学习笔记:json模块和pickle模块(数据序列化)
Python中的json模块和pickle都是用于数据的序列化和反序列化,它们提供的方法也是一样的:dumps,dump,loads,load dumps(obj):将对象序列化为str. dump( ...
- GDOI--DAY2 游记
今天,熬夜不够多,果然,不出所料,爆零了... 第一题,看到数据之大,懵逼了,于是,敲了个二分SPFA,但是!最大的点GG了,呜呜~~~~(>_<)~~~~ ,于是,就不继续做第一题了(虽 ...
- C# 输出结果有System.Byte[]
byte[]类型直接输出或者调用ToString函数都会出现这个结果. 需要执行: byte[] a=new byte[10]; string text = "";for (int ...
- mysql学习第三天笔记
连接连接是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获取数据.在 WHERE子句中书写连接条件. 如果在多个表中出现相同的列名,则需要使用表名作为来自该表的列名的前缀. N个 ...
- centos使用--软件启动关闭等操作的命令
关于centos服务的命令经常会遇到这几种 service systemctl /etc/init.d/ 1 service和/etc/init.d/ service是一个脚本命令,分析service ...
- 程序第一次启动推送跳转,handleOpenURL没法跳转的原因
iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有 ...