#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. linux之crontab定时器

    一.安装crontab yum -y install vixie-cron yum -y install crontabs 说明:vixie-cron 软件包是 cron 的主程序:crontabs ...

  2. Python核心编程正则表达式练习题1-1 识别后续的字符串:“bat”、“bit”、“but”、“hat”、“hit”或者“hut”

    # 1-1 识别后续的字符串:“bat”.“bit”.“but”.“hat”.“hit”或者“hut”. import re # 正则表达式,|元字符表示选择“或” # character = 'ba ...

  3. 一、Linux 设备驱动介绍及开发环境搭建(续)

    1.2.6 uboot 编译安装 嵌入式 bootloader 的功能: 功能类似于 PC 的 BIOS.硬件检测是否正常 加载操作系统镜像到 RAM 设置不同的启动方式 常见的启动方式: NOR/N ...

  4. 微信支付-无法识别qrcode生成的二维码图片

    1.开始使用 table方式,但是还是无法识别二维码  http://www.cnblogs.com/staticed/p/8549316.html var code_url = data.code_ ...

  5. enums应用详解

    枚举类: 获取枚举相关值:

  6. jquery预览本地图片

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...

  7. left semi join VS left join

    left semi join VS left join思考: 建表 CREATE TABLE `kv1`( `k1` string, `v1` string) ROW FORMAT SERDE 'or ...

  8. php目录函数操作,以及使用递归

    opendir 找到对应的目录 将目录中所有文件全部读入到内存(包含子文件夹下的所有文件) 将目录指针指向第一个文件 readdir 读取当前指针所指向的文件的文件名 2.将目录指针向下移动一位 ch ...

  9. php 的windows集成开发环境

    1.安装视频  https://www.bilibili.com/video/av10274152/?p=5 2.所需的安装包: https://pan.baidu.com/s/1GLnuzkKFIT ...

  10. 对云信SDK的研究1

    1.云信大部分用了jq 2.很多接口 3.是可以文档很健全