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. Volatile的3大特性

    Volatile volatile是Java虚拟机提供的轻量级的同步机制 3大特性 1.保证可见性 当多个线程同时访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值 案例代码 ...

  2. 转 关于HttpClient,HttpURLConnection,OkHttp的用法

    转自:https://www.cnblogs.com/zp-uestc/p/10371012.html 1 HttpClient入门实例 1.1发送get请求 1 2 3 4 5 6 7 8 9 10 ...

  3. Multiple Inheritance in C++

    Multiple Inheritance is a feature of C++ where a class can inherit from more than one classes. The c ...

  4. Spring(3):AOP面向切面编程

    一,AOP介绍 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开 ...

  5. 侵入式&非侵入式

    侵入式设计 引入了框架,对现有的类的结构有影响:即需要实现或继承某些特定类. 例如:Struts框架 非侵入式设计 引入了框架,对现有的类结构没有影响. 例如:Hibernate框架 / Spring ...

  6. 【Spring Framework】Spring 入门教程(一)控制反转和依赖注入

    参考资料 Spring 教程 说在前面 什么样的架构,我们认为是一个优秀的架构? 判断准则:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:在不断添加新的代码的同时,可以不修改原有代码,即符合 ...

  7. Spring Boot发布war包流程

    1.修改web model的pom.xml <packaging>war</packaging> SpringBoot默认发布的都是jar,因此要修改默认的打包方式jar为wa ...

  8. SQL注入 (1) SQL注入类型介绍

    SQL注入 SQL注入介绍与分类 1. 什么是sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2. sql注入类型 按照注入 ...

  9. Apache Log4j2远程代码执行漏洞攻击,华为云安全支持检测拦截

    近日,华为云安全团队关注到Apache Log4j2 的远程代码执行最新漏洞.Apache Log4j2是一款业界广泛使用的基于Java的日志工具,该组件使用范围广泛,利用门槛低,漏洞危害极大.华为云 ...

  10. 深入分析 Java ZGC

    传统的垃圾回收 CMS 与 G1 停顿时间瓶颈 ZGC 概览 深入 ZGC 原理 标记 Marking 着色指针 Reference Coloring Relocation 重映射和读屏障 Remap ...