POJ2417 Discrete Logging
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
Description
B
L
== N (mod P)
Input
Output
Sample Input
5 2 1
5 2 2
5 2 3
5 2 4
5 3 1
5 3 2
5 3 3
5 3 4
5 4 1
5 4 2
5 4 3
5 4 4
12345701 2 1111111
1111111121 65537 1111111111
Sample Output
0
1
3
2
0
3
1
2
0
no solution
no solution
1
9584351
462803587
Hint
B
(P-1)
== 1 (mod P)
for any prime P and some other (fairly rare) numbers known as base-B pseudoprimes. A rarer subset of the base-B pseudoprimes, known as Carmichael numbers, are pseudoprimes for every base between 2 and P-1. A corollary to Fermat's theorem is that for any m
B
(-m)
== B
(P-1-m)
(mod P) .
Source
正解:BSGS算法
解题报告:
BSGS模板题。
BSGS又称大步小步算法(有人戏称之为拔山盖世算法),其实应该算是一种优化暴力,是一种用空间换时间的办法。
首先我们想对于$a^{x} \equiv b$ ($mod p$),$a、b、p$已知,求最小的正整数$x$。不妨设 $m= \sqrt{p} $ 取上整,令 $x=i*m+j$ ,那么我把原式化开之后就可以得到$a^{m*i}与b*a^{j}$关于p同余。对于右边值从$0$到$m$枚举$j$,把值插入哈希表,对于左边值从$1$到$m$枚举$i$,把值在哈希表中查询看是否存在,查询到的第一个答案即为所求。如果找不到的话,考虑因为我等于是枚举了$ a^{p} $以内的所有情况,但是还没有找到,根据费马小定理,指数大于$p$一定无解。
正确性的话应该是很好想通的,因为i枚举一开始就是$1$,乘上$m$之后显然一定比$b$大。
另外注意一点,因为插入哈希表时如果出现了相等的情况,显然$j$越大越好,所以j从小到大枚举时可以直接覆盖掉之前的结果。
//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef long long LL;
const int MOD = 300007;
const int MAXM = 100000;
LL p,b,ans,n,to[MAXM],next[MAXM];
int ecnt,first[MOD+12],block,w[MAXM];
inline LL gcd(LL x,LL y){ if(y==0) return x; return gcd(y,x%y); }
inline LL fast_pow(LL x,LL y){ if(y==0) return 1; LL r=1; while(y>0) { if(y&1) r*=x,r%=p; x*=x; x%=p; y>>=1; } return r; }
inline int getint(){
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} inline void insert(LL x,int j){
LL cc=x; x%=MOD; for(int i=first[x];i;i=next[i]) if(to[i]==cc) { w[i]=j; return ; }
next[++ecnt]=first[x]; first[x]=ecnt; to[ecnt]=cc; w[ecnt]=j;
} inline LL query(LL x){
LL cc=x; x%=MOD; for(int i=first[x];i;i=next[i]) if(to[i]==cc) return w[i];
return -1;
} inline void work(){
bool ok;
while(scanf("%lld",&p)!=EOF) {
b=getint(); n=getint(); ans=0; if(n==1) { printf("0\n"); continue; }
if(gcd(b,p)!=1) { printf("no solution\n"); continue; }
memset(first,0,sizeof(first)); ecnt=0;
block=sqrt(p); if(block*block<p) block++;
for(int i=0;i<=block;i++) insert((n*fast_pow(b,i))%p,i);
LL bm=fast_pow(b,block); ok=false;
for(int i=1;i<=block;i++) {
ans=query(fast_pow(bm,i));
if(ans==-1) continue;
ok=true; printf("%lld\n",(LL)i*block-ans);
break;
}
if(!ok) printf("no solution\n");
}
} int main()
{
work();
return 0;
}
POJ2417 Discrete Logging的更多相关文章
- 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【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< ...
- POJ2417 Discrete Logging | A,C互质的bsgs算法
题目: 给出A,B,C 求最小的x使得Ax=B (mod C) 题解: bsgs算法的模板题 bsgs 全称:Baby-step giant-step 把这种问题的规模降低到了sqrt(n)级别 首 ...
- Discrete Logging(poj2417)
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5120 Accepted: 2319 ...
- POJ 2417 Discrete Logging (Baby-Step Giant-Step)
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2819 Accepted: 1386 ...
- [poj2417]Discrete Logging_BSGS
Discrete Logging poj-2417 题目大意:求$a^x\equiv b(mod\qquad c)$ 注释:O(分块可过) 想法:介绍一种算法BSGS(Baby-Step Giant- ...
- 【BSGS】BZOJ3239 Discrete Logging
3239: Discrete Logging Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 729 Solved: 485[Submit][Statu ...
随机推荐
- CSS3-01 简介
概述 HTML 文档由包含 HTML 标签的 HTML 元素组成,HTML 标签被用于定义文档的内容.HTML 文档内容没有额外的样式,以纯文本流的方式渲染到浏览器页面.需要借助层叠样式表(CSS)来 ...
- crontab -e 每天定时备份mysql
contab -e 00 03 * * * mysqldump -u juandx --password=wenbin -d 'juandx$blog' -h host > /home/juan ...
- MongoDB学习笔记~大叔分享批量添加—批量更新—批量删除
回到目录 说它是批量操作,就是说将集合对象一次提交到服务器,并对数据进行持久化,如果您的代码是一次一次的提交,那不算是批量操作!在之前的mongodb仓储中并没有对批量更新和批量删除进行实现,而今天在 ...
- mapreduce导出MSSQL的数据到HDFS
今天想通过一些数据,来测试一下我的<基于信息熵的无字典分词算法>这篇文章的正确性.就写了一下MapReduce程序从MSSQL SERVER2008数据库里取数据分析.程序发布到hadoo ...
- 关于 Java 数组的 12 个最佳方法
1. 声明一个数组 String[] aArray = new String[5]; String[] bArray = {"a","b","c&q ...
- 利用mysql-proxy进行mysql数据库的读写分离
实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 mysql-proxy-0 ...
- bean 接收的参数为Class类型
这两个是等价的
- Spring整合Redis
1.相关jar包 除了Spring必须的jar外,还需要spring-data-redis,jedis,commons-pool,这里使用的是maven,也可以拿着url把jar包下下来 <!- ...
- 第6章 Java类中的方法
1.如何定义java的方法 什么是方法:方法使用来解决一类问题的代码集合,是一个功能模块在类中定义个方法的方法是: 访问修饰符 返回值类型 方法名(参数列表){ 方法体 } 1.访问修饰符,是限制该方 ...
- no-proxy 和proxy 的区别
Child <- many-to-one ->Parent class Child { private Parent paren ...