zoukankan      html  css  js  c++  java
  • poj 2417 && poj3243(Baby-Step Giant-Step)

    Discrete Logging
    Time Limit: 5000MS   Memory Limit: 65536K
    Total Submissions: 4624   Accepted: 2113

    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, base B, modulo P. That is, find an integer L such that 
        B
    L
     == N (mod P)

    Input

    Read several lines of input, each containing P,B,N separated by a space.

    Output

    For each line print the logarithm on a separate line. If there are several, print the smallest; if there is none, print "no solution".

    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

    题意:

    a^x = b(mod n) ,求解x(模板题)


     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <algorithm>
     6 #include <cmath>
     7 using namespace std;
     8 typedef long long ll;
     9 typedef long double ld;
    10 
    11 using namespace std;
    12 #define MOD 76543
    13 int hs[MOD],head[MOD],Next[MOD],id[MOD],top;
    14 
    15 void insert(int x,int y)
    16 {
    17     int k = x % MOD;
    18     hs[top] = x,id[top] = y,Next[top] = head[k],head[k] = top++;
    19 }
    20 
    21 int find(int x)
    22 {
    23     int k = x % MOD;
    24     for(int i = head[k];i != -1;i= Next[i])
    25     {
    26         if(hs[i] == x)
    27             return id[i];
    28     }
    29     return -1;
    30 }
    31 
    32 int BSGS(int a,int b,int n)
    33 {
    34     memset(head,-1,sizeof(head));
    35     top = 1;
    36     if(b == 1)
    37         return 0;
    38     int m = sqrt(n*1.0),j;
    39     long long x = 1,p =1;
    40     for(int i = 0;i < m;i++,p = p*a%n)
    41     insert(p*b%n,i);
    42     for(ll i = m;;i+=m)
    43     {
    44         if((j = find(x = x*p % n)) != -1) return i-j;
    45         if(i > n) break;
    46     }
    47     return -1;
    48 }
    49 
    50 int main()
    51 {
    52     int p,b,n;
    53     while(scanf("%d%d%d",&p,&b,&n) != EOF)
    54     {
    55         int ans = BSGS(b,n,p);
    56         if(ans == -1)
    57             printf("no solution
    ");
    58         else
    59         printf("%d
    ",ans);
    60     }
    61     return 0;
    62 }
    View Code
  • 相关阅读:
    随笔1
    随笔
    shared_ptr<> reset
    c++模板库(简介)
    rockmongo用法
    随笔
    TEXT宏,TCHAR类型
    sprintf
    基于SOA的银行系统架构
    大纲6 信息化规划与管理
  • 原文地址:https://www.cnblogs.com/Przz/p/5409647.html
Copyright © 2011-2022 走看看