【bzoj3239】Discrete Logging BSGS
来源:互联网 发布:unity3d 联机unet 编辑:程序博客网 时间:2024/06/07 01:16
Description
Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 2 <= N < P, compute the discrete logarithm of N, base B, modulo P. That is, find an integer L such that
BL == 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”.
The solution to this problem requires a well known result in number theory that is probably expected of you for Putnam but not ACM competitions. It is Fermat’s theorem that states
B(P-1) == 1 (mod P)
for any prime P and some other (fairly rare) numbers known as base-B pseudoprimes. A rarer subset of the base-B pseudoprimes, known as Carmichael numbers, are pseudoprimes for every base between 2 and P-1. A corollary to Fermat’s theorem is that for any m
B(-m) == B(P-1-m) (mod P) .
Sample Input
5 2 15 2 25 2 35 2 45 3 15 3 25 3 35 3 45 4 15 4 25 4 35 4 412345701 2 11111111111111121 65537 1111111111
Sample Output
013203120no solutionno solution19584351462803587
HINT
Source
裸题。
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<map>#include<cmath>using namespace std;typedef long long LL;LL ksm(LL a,LL b,LL mod){ LL ans = 1; while(b) { if(b & 1) ans = ((ans % mod) * (a % mod)) % mod; a = ((a % mod) * (a % mod)) % mod; b >>= 1; } return ans;}map<LL,LL> h;LL BSGS(LL a,LL b,LL mod){ a %= mod; b %= mod; if(a == 0 && b == 0) return 1; else if(a == 0) return -1; h.clear(); LL m = ceil(sqrt(mod)); LL ni = ksm(a,mod - m - 1,mod); LL t = 1; h[t] = 0; for(int i = 1;i < m;i ++) { t = (t * (a % mod)) % mod; if(t != 1 && !h[t]) h[t] = i; } for(int i = 0;i < m;i ++) { LL ans = h[b]; if(b == 1 || ans) { return i * m + ans; } b = (b * ni) % mod; } return -1;}int main(){ LL mod,a,b; while(~scanf("%lld%lld%lld",&mod,&a,&b)) { LL ans = BSGS(a,b,mod); if(ans != -1) printf("%lld\n",ans); else puts("no solution"); } return 0;}
- 【bzoj3239】Discrete Logging BSGS
- [BZOJ3239][BSGS]Discrete Logging
- [BZOJ3239][poj2417]Discrete Logging(BSGS算法)
- Bzoj3239:Discrete Logging:BSGS模板题
- poj2417 bzoj3239 Discrete Logging(bsgs)
- 【bzoj3239】 Discrete Logging
- POJ 2417 Discrete Logging BSGS
- BZOJ 3239 Discrete Logging BSGS
- bzoj 3239: Discrete Logging BSGS
- BZOJ 3239 Discrete Logging BSGS
- [POJ 2417]Discrete Logging:BSGS
- [ BSGS ] BZOJ3239
- [poj 2417]Discrete Logging 数论 BSGS
- 【BZOJ】【P3239】【Discrete Logging】【题解】【BSGS】
- [poj 2417] Discrete Logging · BSGS
- POJ 2417 Discrete Logging (BSGS)
- bzoj 3239: Discrete Logging (BSGS)
- PoJ 2417 Discrete Logging BSGS裸题
- 自定义视图与工厂模式
- Good Bye 2015
- 大数据(四) - MapReduce
- Java笔记14:泛型初探
- iOS 一个方法 解决四舍五入
- 【bzoj3239】Discrete Logging BSGS
- Fragment碎片用法
- 蓝色多瑙河
- Java读写文件
- SourceInsight的实用设置
- OpenLayers3-1-Accessible Map
- P16 (**) Drop every N'th element from a list.
- Centos 更改语言设置为中文
- linux变量篇(二) 有趣的环境变量