#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. [Python模块]Windows环境安装PyV8并执行js语句

    安装这个玩意儿真挺坑的,pip直接安装失败,windows的py库压根搜不到.. 搜索良多解决办法终于找到了,在这里贴出来,主要是把这个库下载下来再安装,但它的下载地址HERE位于外面的世界(你懂得) ...

  2. spring AspectJ的Execution表达式(转载)

    原文:http://blog.csdn.net/peng658890/article/details/7223046 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需 ...

  3. JAVA利用递归的方法删除一个文件夹以及文件夹下所有的子文件

    public static boolean deleteFolder(String url) { File file = new File(url); if (!file.exists()) { re ...

  4. VS插件CodeRush for Visual Studio发布v19.1.5|新的Inline Lambda重构

    CodeRush是一个强大的Visual Studio .NET 插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验.CodeRush能帮助你以极高的效率创建和维护源代码.Consume- ...

  5. 【react学习二】create-react-app 接入antd 并按需加载组件

    1.安装 cnpm i babel-plugin-import --save-dev 2.使用 在根目录下的package.json下的bable中添加相应代码 "babel": ...

  6. DB2常用指令

    1. 启动实例(db2inst1): db2start 2. 停止实例(db2inst1): db2stop 3. 列出所有实例(db2inst1) db2ilist 3-1.列出当前实例: db2 ...

  7. Linux缺少动态连接库.so--cannot open shared object file: No such file or directory

    1 Liunx安装报错时,缺少动态链接库时,形式如下: /usr/local/libexec/gcc/x86_64-unknown-liunx-gnu/4.8.2/cc1: error while l ...

  8. python3---99乘法表

    参考: http://www.cnblogs.com/suiy-160428/p/5594389.html #!/usr/bin/env pythonfor i in range(1,10): for ...

  9. pyinstaller打包的exe太大?你需要嵌入式python玄学 拓展篇

    上篇我们讲到embedded版本的基础操作 CodingDog:pyinstaller打包的exe太大?你需要嵌入式python玄学 惊喜篇​zhuanlan.zhihu.com 可是却没有办法用pi ...

  10. Spring Cloud Stream教程(一)介绍Spring Cloud Stream

    Spring Cloud Stream是构建消息驱动的微服务应用程序的框架.Spring Cloud Stream基于Spring Boot建立独立的生产级Spring应用程序,并使用Spring I ...