离散对数的求解(bsgs)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<map>
 7 using namespace std;
 8 typedef long long ll;
 9 ll q=2147483647,a=3,yy,y2,m,ans,t;
10 map<ll,int>mp;
11 ll mod_pow(ll x,ll n,ll mod){
12     ll res=1;
13     while(n>0){
14         if(n&1)    res=res*x%mod;
15         x=x*x%mod;
16         n>>=1;
17     }
18     return res;
19 }
20
21 int main(){
22     while(~scanf("%lld%lld",&yy,&y2)){
23         mp.clear();
24         m=ceil(sqrt(q));
25         for(ll i=0;i<=m;i++){
26             if(i==0){
27                 ans=yy%q;
28                 mp[ans]=i;
29                 continue;
30             }
31             ans=ans*a%q;
32             mp[ans]=i;
33         }
34         bool flag=false;
35         ans=1;
36         t=mod_pow(a,m,q);
37
38
39         for(int i=1;i<=m;i++){
40             ans=ans*t%q;
41             if(mp[ans]){
42                 ll temp=i*m-mp[ans];
43                 ll rr=mod_pow(y2,temp,q);
44                 printf("%lld\n",rr);
45                 flag=true;
46                 break;
47             }
48         }
49         if(!flag){
50         printf("No Solution\n");
51         }
52     }
53     return 0;
54 } 

时间: 2025-01-08 02:55:44

离散对数的求解(bsgs)的相关文章

Luogu 9月月赛A(BSGS)

11--1(n个)=99--9(n个)/9=(10n-1)/9. 那么显然就是求离散对数了,BSGS即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<map> using namespace std; #define ll long

Codeforces 536F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法

我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎阅读本题解! P.S. 这几个算法我是一个也想不起来了 TAT 题目链接 Codeforces 536F Lunar New Year and a Recursive Sequence 新年和递推数列 题意描述 某数列\(\{f_i\}\)递推公式:\[f_i = (\prod_{j=1}^kf_{

Discrete Log Algorithms :Baby-step giant-step

离散对数的求解 1.暴力 2.Baby-step giant-step 3.Pollard's ρ algorithm -- 下面搬运一下Baby-step giant-step 的做法 这是在 https://ctf-wiki.github.io/ctf-wiki/crypto/asymmetric/discrete-log/discrete-log/上看到的,比较容易理解. 而且,里面的代码写得简洁明了. 写一下自己理解和自己照着写了一遍 原文代码: def bsgs(g, y, p): m

【bzoj2219-数论之神】求解x^a==b(%n)-crt推论-原根-指标-BSGS

http://www.lydsy.com/JudgeOnline/problem.php?id=2219 弄了一个晚上加一个午休再加下午一个钟..终于ac..TAT 数论渣渣求轻虐!! 题意:求解 x^A=B(mod n) 在0~n内解的个数.其中1 <= A, B <= 10^9, 1 <= K <= 5 * 10^8  (n=2*K+1) 首先先说这一题的弱化版:bzoj1319 http://www.lydsy.com/JudgeOnline/problem.php?id=1

CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)

题面 传送门 前置芝士 \(BSGS\) 什么?你不会\(BSGS\)?百度啊 原根 对于素数\(p\)和自然数\(a\),如果满足\(a^x\equiv 1\pmod{p}\)的最小的\(x\)为\(p-1\),那么\(a\)就是\(p\)的一个原根 离散对数 对于素数\(p\),以及\(p\)的一个原根\(g\),定义\(y\)为\(x\)的离散对数,当且仅当\(g^y\equiv x\pmod{p}\),记\(y\)为\(ind_g x\).不难发现原数和离散对数可以一一对应.也不难发现离

【EXT-BSGS算法求离散对数】POJ Clever Y 3243

Clever Y Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7259 Accepted: 1795 Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, Y, Z, we all know how to figure out K fast. However, given X,

【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS

[bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t  n=1 当 a=1  当 a=0 判断b==t 1 /* http://www.cnblogs.com/karl07/ */ 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <map&

【BZOJ-3122】随机数生成器 BSGS

3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1362  Solved: 531[Submit][Status][Discuss] Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Output 共T行,每行一个整数表示他最早读到第t页是

BSGS

求解a^x=b(mod p),p为质数时,直接bsgs就可以了. 将x写作km-j,m=sprt(p)时复杂度最优,a^(km)=ba^j(mod p),我们预先求出a^j(j=0~m-1)存入map,然后穷举k=1~p/m,如果map中有值,返回km-cnt[]就可以了. bzoj4128 Matrix 题目大意:a^x=b(mod p),a.b为矩阵. 思路:bsgs直接求就可以了,因为不需要求逆,所以方便许多.(注意map要重定义比较符号) #include<iostream> #inc