Discrete Logging
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 5120   Accepted: 2319

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

思路:baby_step,giant_step算法模板题

  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<stdlib.h>
5 #include<queue>
6 #include<vector>
7 #include<math.h>
8 #include<string.h>
9 #include<map>
10 #include<set>
11 using namespace std;
12 typedef long long LL;
13 LL mod[65539];
14 bool judge(LL n)
15 {
16 LL ac=sqrt(1.0*n);
17 if(ac*ac==n)
18 return true;
19 else return false;
20 }
21 map<LL,LL>my;
22 set<LL>que;
23 set<LL>::iterator it;
24 LL quick(LL n,LL m,LL p);
25 LL gcd(LL n,LL m)
26 {
27 if(m==0)
28 return n;
29 else return gcd(m,n%m);
30 }
31 pair<LL,LL>Pc(LL n,LL m)
32 {
33 if(m==0)
34 return make_pair(1,0);
35 else
36 {
37 pair<LL,LL>N=Pc(m,n%m);
38 return make_pair(N.second,N.first-(n/m)*N.second);
39 }
40 }
41 typedef struct pp
42 {
43 LL x;
44 LL id;
45 } ss;
46 ss table[655390];
47 ss tt[655390];
48 bool cmp(pp p,pp q)
49 {
50 if(p.x==q.x)
51 return p.id<q.id;
52 return p.x<q.x;
53 }
54 int main(void)
55 {
56 LL P,B,N;
57 while(scanf("%lld %lld %lld",&P,&B,&N)!=EOF)
58 {
59 bool a=judge(P);
60 LL ask=sqrt(1.0*P);
61 if(!a)
62 ask+=1;
63 int i,j;
64 mod[0]=1;
65 int vv=0;
66 table[0].id=0;
67 table[0].x=1;
68 int cn=1;
69 for(i=1; i<=ask; i++)
70 {
71 mod[i]=mod[i-1]*B%P;
72 table[i].id=i;
73 table[i].x=mod[i];
74 }
75 sort(table,table+ask+1,cmp);
76 tt[0].id=table[0].id;
77 tt[0].x=table[0].x;
78 LL yy=tt[0].x;
79 for(i=1;i<=ask;i++)
80 {
81 if(table[i].x!=yy)
82 {
83 yy=table[i].x;
84 tt[cn].x=yy;
85 tt[cn].id=table[i].id;
86 cn++;
87 }
88 }
89 int fl=0;
90 LL ack;
91 LL nn=quick(B,P-2,P);
92 nn=quick(nn,ask,P);
93 LL ni=1;
94 for(i=0; i<=ask; i++)
95 {
96 LL ap=ni*N%P;
97 ni%=P;
98 int l=0;
99 int r=cn-1;
100 LL ic=-1;
101 while(l<=r)
102 {
103 int mid=(l+r)/2;
104 if(tt[mid].x>=ap)
105 {
106 ic=mid;
107 r=mid-1;
108 ack=tt[ic].id;
109 }
110 else l=mid+1;
111 }
112 if(ic!=-1&&tt[ic].x==ap)
113 {
114 //printf("%lld\n",table[ic].x);printf("%d\n",i) ;
115 fl=1;
116 break;
117 }
118 ni=(ni*nn)%P;
119 }
120 if(!fl)
121 printf("no solution\n");
122 else printf("%lld\n",ack+(LL)i*ask);
123 }
124 return 0;
125 }
126 LL quick(LL n,LL m,LL p)
127 {
128 n%=p;
129 LL ans=1;
130 while(m)
131 {
132 if(m&1)
133 {
134 ans=ans*n%p;
135 }
136 n=n*n%p;
137 m/=2;
138 }
139 return ans;
140 }

Discrete Logging(poj2417)的更多相关文章

  1. Discrete Logging(POJ2417 + BSGS)

    题目链接:http://poj.org/problem?id=2417 题目: 题意: 求一个最小的x满足a^x==b(mod p),p为质数. 思路: BSGS板子题,推荐一篇好的BSGS和扩展BS ...

  2. POJ2417 Discrete Logging【BSGS】

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5577   Accepted: 2494 ...

  3. [POJ2417]Discrete Logging(指数级同余方程)

    Discrete Logging Given a prime P, 2 <= P < 2 31, an integer B, 2 <= B < P, and an intege ...

  4. POJ 2417 Discrete Logging (Baby-Step Giant-Step)

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2819   Accepted: 1386 ...

  5. 【BSGS】BZOJ3239 Discrete Logging

    3239: Discrete Logging Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 729  Solved: 485[Submit][Statu ...

  6. poj 2417 Discrete Logging ---高次同余第一种类型。babystep_gaint_step

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2831   Accepted: 1391 ...

  7. BSGS算法+逆元 POJ 2417 Discrete Logging

    POJ 2417 Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4860   Accept ...

  8. 【BZOJ3239】Discrete Logging BSGS

    [BZOJ3239]Discrete Logging Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B ...

  9. Discrete Logging

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5865   Accepted: 2618 ...

随机推荐

  1. kubernetes部署kube-scheduler服务

    同样的分非认证授权和认证授权: 非认证授权: cat > /lib/systemd/system/kube-scheduler.service <<EOF [Unit] Descri ...

  2. 工作学习2-gcc升级引发的崩溃

    分享一下调查gcc 8.0下,函数漏写返回值崩溃问题,调查记录. 现在新的硬件,基本操作系统都是redhat 8.0,升级后测试时,发现了一个崩溃问题,记录一下. ================== ...

  3. C语言之内核中的struct list_head 结构体

    以下地址文章解释很好 http://blog.chinaunix.net/uid-27122224-id-3277511.html 对下面的结构体分析 1 struct person 2 { 3 in ...

  4. CPU 是如何认识和执行代码的

    CPU的介绍 CPU 也称为微处理器,是计算机的心脏和/或大脑. 深入研究计算机的核心,可以帮助我们有效地编写计算机程序. CPU 是计算机的心脏和大脑,它执行提供给他们的指令.它的主要工作是执行算术 ...

  5. show processlist命令详解

    1.show processlist; SHOW PROCESSLIST显示哪些线程正在运行.您也可以使用mysqladmin processlist语句得到此信息.如果您有SUPER权限,您可以看到 ...

  6. Oracle常用函数(SQL语句)

    使用sql函数,您可以在一个select语句的查询当中,直接计算数据库资料的平均值.总数.最小值.最大值.总和.标准差.变异数等统计.使用recordset对象时,也可使用这些sql函数. sql函数 ...

  7. 【Linux】【Services】【Web】Nginx基础

    1. 概念 1.1. 消息通知机制:同步synchronous,异步asynchronous 同步:等待对方返回信息 异步:被调用者通过状态.通知或回调通知调用者 状态:调用者每隔一段时间就需要检查一 ...

  8. 7、Redis五大数据类型---集合(Set)

    一.集合(Set)简介 Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1). ...

  9. <转>android 解析json数据格式

    json数据格式解析我自己分为两种:一种是普通的,一种是带有数组形式的: 普通形式的:服务器端返回的json数据格式如下:{"userbean":{"Uid": ...

  10. (转)synchronize线程同步例子

    在CSDN开了博客后,一直也没在上面发布过文章,直到前一段时间与一位前辈的对话,才发现技术博客的重要,立志要把CSDN的博客建好.但一直没有找到好的开篇的主题,今天再看JAVA线程互斥.同步的时候又有 ...