zoukankan      html  css  js  c++  java
  • 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
    ");
    45         else printf("%d
    ", ans);
    46     }
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    微软铁杆兄弟诺基亚开发基于Linux的手机
    Linux目录递归改变文件名大小写
    boa-0.94.13 移植到 ARM
    LINUX如何设置只允许SSH登陆?
    9.4. 使用 I/O 内存
    I-O 端口和 I-O 内存
    Linux 的虚拟文件系统--各结构之间的联系
    Linux 系统调用
    【poj2528】Mayor's posters
    【poj3225】Help with Intervals
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/7616043.html
Copyright © 2011-2022 走看看