poj2417(Baby-Step Giant-Step)

题目链接:http://poj.org/problem?id=2417

题意:求满足给出 P, N, B, 求满足条件 BL == N (mod P) 的最小 L, 若不存在则输出 no solution.

思路:Baby-Step Giant-Step 算法

设 L = kt ? m,其中 t = ?sqrt(L)?, 0 <= m < t.那么 B^L = N (mod P) 就等价于 B^(kt ? m) = N (mod P) 即 B^(kt) ? N^(?1) = B^m (mod P).我们可以先预处理出所有的 Bi (0 <= i < t) 记录在一个 hash 表里,然后枚举 k,计算 B^(kt) ? N^(?1) 的值,在hash表里找是否有符和条件的 m,若有则 kt ? m 就是答案之一.所有答案中取最小的一个即可。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 #define ll long long
 5 using namespace std;
 6
 7 const int MOD = 76543;
 8 int hs[MOD], head[MOD], next[MOD], id[MOD], top;
 9
10 void insert(int x, int y){
11     int k = x % MOD;
12     hs[top] = x;
13     id[top] = y;
14     next[top] = head[k];
15     head[k] = top++;
16 }
17
18 int find(int x){
19     int k = x % MOD;
20     for(int i = head[k]; i != -1; i = next[i]){
21         if(hs[i] == x) return id[i];
22     }
23     return -1;
24 }
25
26 int BSGS(int a, int b, int n){
27     memset(head, -1, sizeof(head));
28     top = 1;
29     if(b == 1) return 0;
30     int m = sqrt(n * 1.0), j;
31     ll x = 1, p = 1;
32     for(int i = 0; i < m; ++i, p = p * a % n) insert(p * b % n, i);
33     for(ll i = m; ; i += m){
34         if( (j = find(x = x * p % n)) != -1 ) return i - j;
35         if(i > n) break;
36     }
37     return -1;
38 }
39
40 int main(void){
41     int P, N, B;
42     while(~scanf("%d%d%d", &P, &B, &N)){
43         int ans = BSGS(B, N, P);
44         if(ans == -1) printf("no solution\n");
45         else printf("%d\n", ans);
46     }
47     return 0;
48 }

时间: 2024-10-30 08:05:14

poj2417(Baby-Step Giant-Step)的相关文章

【poj2417】baby step giant step

最近在学习数论,然而发现之前学的baby step giant step又忘了,于是去翻了翻以前的代码,又复习了一下. 觉得总是忘记是因为没有彻底理解啊. 注意baby step giant step只能用在b和p互质的情况下,因为只有b和p互质的情况下,b才有mod p下的逆元.(下面要用到逆元) 当b和p不互质,就要处理一下.现在就正在做这么一题,方法以后再写. 求a^(-m)就用到了求逆元了,那么如何求逆元呢?我学了两种方法: ·1:欧拉定理:当a和n互质,a^φ ( n) ≡ 1(mod

数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)

什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSGS算法中是要求a^m在%c条件下的逆元的,如果a.c不互质根本就没有逆元.) 如果x有解,那么0<=x<C,为什么? 我们可以回忆一下欧拉定理: 对于c是素数的情况,φ(c)=c-1 那么既然我们知道a^0=1,a^φ(c)=1(在%c的条件下).那么0~φ(c)必定是一个循环节(不一定是最小的)

HDU 2815 扩展baby step giant step 算法

题目大意就是求 a^x = b(mod c) 中的x 用一般的baby step giant step 算法会超时 这里参考的是http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 map平衡树查找值 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #include <

HDU 2815 Mod Tree 离散对数 扩展Baby Step Giant Step算法

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2815 题意: 思路:与上题不同,这道题不要求m是素数,是利用扩展Baby Step Giant Step算法求离散对数. 以下转载自:AekdyCoin [扩展Baby Step Giant Step] [问题模型] 求解 A^x = B (mod C) 中 0 <= x < C 的解,C 无限制(当然大小有限制--) [写在前面] 这个问题比较麻烦,目前网络上流传许多版本的做法,不过大部分已近被证明

POJ 2417 Discrete Logging ( Baby step giant step )

Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3696   Accepted: 1727 Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 <= N < P, compute the discrete logarithm of N, b

HDU 2815 Mod Tree (扩展 Baby Step Giant Step )

Mod Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 96 Accepted Submission(s): 38   Problem Description   The picture indicates a tree, every node has 2 children.  The depth of the nodes whos

扩展baby step giant step模版

#include <cstdio> #include <cstring> #include <cmath> #include <map> using namespace std; typedef __int64 LL; LL gcd(LL a, LL b) { return b ? gcd(b, a%b) : a; } LL pow_mod(LL a, LL p, LL n) { LL ans = 1; while(p) { if(p&1) { an

Baby Step Gaint Step

给定同余式,求它在内的所有解,其中总是素数. 分析:解本同余式的步骤如下 (1)求模的一个原根 (2)利用Baby Step Giant Step求出一个,使得,因为为素数,所以有唯一解. (3)设,这样就有,其中,那么得到. (4)求出所有的,可以知道一共有个解,我们求出所有的,然后排个序即可. O(sqrt(n))的时间复杂度 BSGS如下(前向星版本) const maxn=200001; type node=record data,next,id:longint; end; type L

Git Step by Step – (8) Git的merge和rebase

前面一篇文章中提到了"git pull"等价于"git fetch"加上"git merge",然后还提到了pull命令支持rebase模式,这篇文章就介绍一下merge和rebase之间有什么差别. 由于我们主要是想看看merge跟rebase之间的区别,这里就是用本地仓库的分支进行演示了. merge 其实在介绍分支的那篇文章中已经介绍过了一些分支merge的内容,这里就进行一些补充和总结. 下面我们基于本地一个仓库开始介绍,当前仓库的分支情

C# 2012 step by step 学习笔记8 CHAPTER 9 Creating Value types with enumerations and Structures

C# 2012 step by step 学习笔记8 CHAPTER 9 Creating Value types with enumerations and Structures things about 1. Declare an enumeration type. 2. Create and use an enumeration type. 3. Declare a structure type. 4. Create and use a structure type. 5. Explain