#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
ll p,a,b;
ll ksm(ll x,ll y)
{
ll res=1;
while(y) {
if(y&1)res=res*x%p;
y>>=1;
x=x*x%p;
}
return res;
}
map<ll,ll> h;
ll solve(ll a,ll b,ll p)
//设x=im-c,则x+c=im
//a^x * a^c =a^im
{
ll m=ceil(sqrt(p));//向上取整
h.clear();
for(ll i=0; i<m; i++)
//求出b*a,b*a^2,b*a^3...即等式左边那一段,放到map中
{
if(!h.count(b))
h[b]=i;
b=b*a%p;
}
ll now=1,base=ksm(a,m);
for(ll i=1; i<=m+1; i++)
//枚举i,算a^im的结果,然后到hash表中去找
{
now=now*base%p;
if(h.count(now))return i*m-h[now];
}
return -1;
}
int main()
{
while(scanf("%lld%lld%lld",&p,&a,&b)!=EOF)
{
ll ans=solve(a,b,p);
if(ans==-1)printf("no solution\n");
else printf("%lld\n",ans);
}
return 0;
} #include<bits/stdc++.h>
using namespace std;
pair<long long, long long> x[1000001];
long long p, b, n;
long long pow(long long x, long long y, long long p)
{
long long ans = 1;
while(y)
{
if(y & 1) ans *= x, ans %= p;
y >>= 1;
x *= x;
x %= p;
}
return ans;
} long long find(long long l, long long r, long long v)
{
while(l <= r)
{
long long mid = (l + r) / 2;
if(x[mid].first < v)
{
l = mid + 1;
}
else{
r= mid-1;
}
}
return (x[l].first == v) ? l : -1;
} int main()
{
cin >> p >> b >> n;
//b^x =N % p
long long sq = (double)(sqrt(p - 2) + 0.5); x[0].first = 1;
x[0].second = 0;
for(long long i = 1; i < sq; ++i)
//求出b的若干次方Mod P的结果,放到一个表里
{
x[i].first = x[i - 1].first * b;
x[i].first %= p;
x[i].second = i;
}
sort(x, x + sq - 1);//排序
for(long long i = 0; i <= sq; ++i)
{
long long v = n * pow(b, p - 1 - i * sq, p);
v %= p;
long long j = find(0, sq - 1, v);//到表里去找
if(j != -1)
{
cout << i * sq + x[j].second << endl;
return 0;
}
}
cout << "no solution" << endl;
return 0;
}

  

bzoj3929 Discrete Logging 大步小步算法的更多相关文章

  1. 离散对数&&大步小步算法及扩展

    bsgs algorithm ax≡b(mod n) 大步小步算法,这个算法有一定的局限性,只有当gcd(a,m)=1时才可以用 原理 此处讨论n为素数的时候. ax≡b(mod n)(n为素数) 由 ...

  2. 【题解】Matrix BZOJ 4128 矩阵求逆 离散对数 大步小步算法

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 大水题一道 使用大步小步算法,把数字的运算换成矩阵的运算就好了 矩阵求逆?这么基础的线 ...

  3. [模板]大步小步算法——BSGS算法

    大步小步算法用于解决:已知A, B, C,求X使得 A^x = B (mod C) 成立. 我们令x = im - j | m = ceil(sqrt(C)), i = [1, m], j = [0, ...

  4. 离散对数及其拓展 大步小步算法 BSGS

    离散对数及其拓展 离散对数是在群Zp∗Z_{p}^{*}Zp∗​而言的,其中ppp是素数.即在在群Zp∗Z_{p}^{*}Zp∗​内,aaa是生成元,求关于xxx的方程ax=ba^x=bax=b的解, ...

  5. 大步小步算法模板题, poj2417

    大步小步模板 (hash稍微有一点麻烦, poj不支持C++11略坑) #include <iostream> #include <vector> #include <c ...

  6. BSGS-Junior·大步小步算法

    本文原载于:http://www.orchidany.cf/2019/02/06/BSGS-junior/#more \(\rm{0x01}\) \(\mathcal{Preface}\) \(\rm ...

  7. [BSGS]大步小步算法

    问题 BSGS被用于求解离散对数,即同余方程: \[ A^x\equiv B\pmod{P} \] 求\(x\)的最小非负整数解. 保证\(A\perp P\)(互质). 分析 首先,我们根据费马小定 ...

  8. UVA 11916 Emoogle Grid 离散对数 大步小步算法

    LRJ白书上的题 #include <stdio.h> #include <iostream> #include <vector> #include <mat ...

  9. BSGS算法(大步小步算法)

    计算\(y^x ≡ z \ mod\ p\) 中 \(x\) 的解. 这个模板是最小化了\(x\) , 无解输出\(No \ Solution!\) map<ll,ll>data; ll ...

随机推荐

  1. (转) oracle清空数据库脚本

    在开发过程中,可能经常需要重新初始化数据库,在初始化之前,我们肯定希望不再有以前的老表.存储过程等用户对象,用下面的教本就可以做到这一点: BEGIN     FOR rec IN     (SELE ...

  2. docker安装配置mongodb

    1 执行 docker search mongo 命令: 2 运行mongo docker run --name mongo -v /mnt/mongodb:/data/db -p 27017:270 ...

  3. SQL中INEXISTS和IN 的区别和联系

    SET NOCOUNT ON , SET NOCOUNT OFF当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数).当 SET NOCOUNT 为 ...

  4. 工作流学习之入门demo

    /** * Copyright (C), 2015-2018, XXX有限公司 * FileName: DemoMain * Author: happy * Date: 2018/6/23 16:33 ...

  5. collections queue、os、datetime,序列化(json和pickle)模块

    目录 Collections 模块 1.nametuple 2.deque(双端队列) 3.双端队列(deque): 4.Odereddict(有序字典): 5.Defaultdict(默认字典,首字 ...

  6. buuctf@test_your_nc

    测试你的 nc 技巧 :)

  7. JAVA笔记24-IO流(2)-节点流举例

    节点流类型 例1: import java.io.*; public class TestFileInputStream{ public static void main(String args[]) ...

  8. 【Islands and Bridges】题解

    题目 题目描述 给定一些岛屿和一些连接岛屿的桥梁,大家都知道汉密尔顿路是访问每个岛屿一次的路线,在我们这个地图中,每个岛屿有个正整数的权值,表示这个岛屿的观赏价值.假设一共有N个岛屿,用Vi表示岛屿C ...

  9. 对TypeScript进行研究

    1.npm install -g typescript 在编辑器,将下面的代码输入到greeter.ts文件里: function greeter(person) { return "Hel ...

  10. [BZOJ3796]Mushroom追妹纸:后缀自动机+KMP

    分析 这道题有个\(O(n)\)的后缀自动机做法,感觉很好理解就在这说一下. 先对\(s1\)和\(s2\)求最长公共子串,对于\(s2\)的每一个下标\(i\),求一个\(f[i]\)表示以\(s2 ...