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 ...
随机推荐
- 洛谷P4316 绿豆蛙的归宿(期望)
题意翻译 「Poetize3」 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出 ...
- 查询删除的SAP凭证
标准报表查询:RSSCD100 函数模块:CHANGEDOCUMENT_DISPLAY, Display Change Documents 数据表查询:CDHDR, Change document h ...
- 使用c++控制sqlite3
首先,到官网下载相关的压缩包 https://www.sqlite.org/download.html 但是要自己再重新编译一个, 博主自己收集了一下,密码:hixo https://pan.baid ...
- linux下csv导出文件中文乱码问题
近日在服务器端通过导出csv文件,将数据从linux服务器端保存到windows桌面端,以便用户可以通过excel打开使用数据. 但是在使用excel打开csv文件时,出现了中文乱码的情况,但是使用记 ...
- Lucene简单总结
Lucene API Document Document:文档对象,是一条原始数据 文档编号 文档内容 1 谷歌地图之父跳槽FaceBook 2 谷歌地图之父加盟FaceBook 3 谷歌地图创始人拉 ...
- Gson杂记录
//Integer userId = getUserId(); //System.out.println("userId:"+userId); /*for(int i=0;i< ...
- spark练习--mysql的读取
前面我们一直操作的是,通过一个文件来读取数据,这个里面不涉及数据相关的只是,今天我们来介绍一下spark操作中存放与读取 1.首先我们先介绍的是把数据存放进入mysql中,今天介绍的这个例子是我们前两 ...
- Keil如何生成bin文件【Keil生成Bin文件的方法】
使用过Keil的同鞋都知道,现在Keil中默认可以输出.axf的调试文件和可以通过钩选输出的.hex可执行文件,没有bin(二进制)文件的输出选项.可是偏偏某些时候需要或者习惯性的使用.bin文件来进 ...
- 1- js vue.js
1 js 2 Vue.js
- Block那些事儿
1.Block底层原理实现 首先我们来看四个函数 void test1() { int a = 10; void (^block)() = ^{ NSLog(@"a is %d", ...