题意

已知kkk, aaa, ppp. 求 xk≡a (mod p)x^k\equiv a\ (mod\ p)xk≡a (mod p) 的所有根. 根的范围[0,p−1][0,p-1][0,p−1]. ppp为质数

分析

因为ppp是质数,那么一定有原根.设为ggg.

原根的性质如下:

  • 对于[1,p−1][1,p-1][1,p−1]的所有iii,一定存在x∈[1,p−1]x\in[1,p-1]x∈[1,p−1]使得gx≡i (mod p)g^x\equiv i\ (mod\ p)gx≡i (mod p). 此时设xxx为I(i)I(i)I(i).

1.1.1.那么当aaa等于000

  • 只有一个根就是000

2.2.2.当a∈[1,p−1]a\in[1,p-1]a∈[1,p−1]

  • 画画柿子xk≡a (mod p)(gI(x))k≡a (mod p)(gk)I(x)≡a (mod p)\begin{aligned}x^k&\equiv a\ (mod\ p)\\(g^{I(x)})^k&\equiv a\ (mod\ p)\\(g^{k})^{I(x)}&\equiv a\ (mod\ p)\end{aligned}xk(gI(x))k(gk)I(x)​≡a (mod p)≡a (mod p)≡a (mod p)​

    我们知道gkg^kgk,知道aaa,知道ppp.直接BSGSBSGSBSGS就行了.
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int g, prime[100], cnt;
inline int qpow(int a, int b, int c) {
int re = 1;
while(b) {
if(b&1) re = 1ll * re * a % c;
a = 1ll * a * a % c; b >>= 1;
}
return re;
}
inline void Factor(int N) {
int tmp = N;
for(int i = 2; i*i <= N; ++i)
if(tmp % i == 0) {
prime[++cnt] = i;
while(tmp % i == 0) tmp /= i;
}
if(tmp > 1) prime[++cnt] = tmp;
}
inline int Get_g(int p) { //找原根
Factor(p-1);
for(int g = 2; ; ++g) {
bool flg = true;
for(int i = 1; i <= cnt; ++i)
if(qpow(g, (p-1)/prime[i], p) == 1)
{ flg = 0; break; }
if(flg) return g;
}
}
map<int, int>myhash;
vector<int>ans;
inline void Baby_Step_Giant_Step(int a, int b, int p) {
if(b == 1) ans.push_back(0);
myhash.clear();
int m = int(sqrt(p) + 1);
LL base = b;
for(int i = 0; i < m; ++i) {
myhash[base] = i;
base = 1ll * base * a % p;
}
base = qpow(a, m, p);
LL tmp = 1;
for(int i = 1; i <= m+1; ++i) {
tmp = 1ll * tmp * base % p;
if(myhash.count(tmp))
ans.push_back(i*m - myhash[tmp]);
}
}
int main() {
int p, k, a, g;
scanf("%d%d%d", &p, &k, &a);
if(!a) return puts("1"), puts("0"), 0;
//(g^I(x))^k = a (mod p)
//(g^k)^I(x) = a
Baby_Step_Giant_Step(qpow(g = Get_g(p), k, p), a, p);
for(int i = 0, siz = ans.size(); i < siz; ++i)
ans[i] = qpow(g, ans[i], p);
sort(ans.begin(), ans.end());
int siz = ans.size();
siz = unique(ans.begin(), ans.end()) - ans.begin();
printf("%d\n", siz);
for(int i = 0; i < siz; ++i)
printf("%d\n", ans[i]); }

BZOJ 1420: Discrete Root (原根+BSGS)的更多相关文章

  1. bzoj 1420 Discrete Root - 原根 - exgcd - BSGS

    题目传送门 戳我来传送 题目大意 给定$k, p, a$,求$x^{k}\equiv a \pmod{p}$在模$p$意义下的所有根. 考虑模$p$下的某个原根$g$. 那么$x  = g^{ind_ ...

  2. BZOJ 1420 Discrete Root

    思路:数学大汇总 提交:\(3\)次 错因:有一个\(j\)写成\(i\) 题解: 求:\(x^k \equiv a \mod p\) 我们先转化一下:求出\(p\)的原根\(g\) 然后我们用\(B ...

  3. BZOJ 3239 Discrete Logging(BSGS)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3239 [题目大意] 计算满足 Y^x ≡ Z ( mod P) 的最小非负整数 [题解 ...

  4. BSGS 扩展大步小步法解决离散对数问题 (BZOJ 3239: Discrete Logging// 2480: Spoj3105 Mod)

    我先转为敬? orz% miskcoo 贴板子 BZOJ 3239: Discrete Logging//2480: Spoj3105 Mod(两道题输入不同,我这里只贴了3239的代码) CODE ...

  5. 【BZOJ 1319】 Sgu261Discrete Rootsv (原根+BSGS+EXGCD)

    1319: Sgu261Discrete Roots Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 389  Solved: 172 Descriptio ...

  6. bzoj 3239: Discrete Logging && 2480: Spoj3105 Mod【BSGS】

    都是BSGS的板子题 此时 \( 0 \leq x \leq p-1 \) 设 \( m=\left \lceil \sqrt{p} \right \rceil ,x=i*m-j \)这里-的作用是避 ...

  7. bzoj1420/1319 Discrete Root

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1420 http://www.lydsy.com/JudgeOnline/problem.ph ...

  8. POJ2417 Discrete Logging【BSGS】

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5577   Accepted: 2494 ...

  9. 51Nod1123 X^A Mod B 数论 中国剩余定理 原根 BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1123.html 题目传送门 - 51Nod1123 题意 $T$ 组数据. 给定 $A,B,C$,求 ...

随机推荐

  1. Linux下的I/O复用与epoll详解(转载)

    Linux下的I/O复用与epoll详解 转载自:https://www.cnblogs.com/lojunren/p/3856290.html  前言 I/O多路复用有很多种实现.在linux上,2 ...

  2. 使用nfsstat命令查看NFS服务器状态

    转载于:http://www.cnblogs.com/jankie/archive/2011/09/03/2165851.html nfsstat命令显示关于NFS和到内核的远程过程调用(RPC)接口 ...

  3. Springboot问题解决记录

    本随笔只为了方便查阅 如何将SpringBoot项目地打成一个war包: 传送门:https://blog.csdn.net/zhoucheng05_13/article/details/779152 ...

  4. 并不对劲的复健训练-bzoj5250:loj2473:p4365:[九省联考2018]秘密袭击

    题目大意 有一棵\(n\)(\(n\leq 1666\))个点的树,有点权\(d_i\),点权最大值为\(w\)(\(w\leq 1666\)).给出\(k\)(\(k\leq n\)),定义一个选择 ...

  5. redis 学习(18)-- AOF

    redis -- AOF 什么是 AOF 通过日志方式将redis中的写命令进行日志记录,保存在硬盘文件中. 日志记录的实质是将写命令写在硬盘的缓冲区中,再根据相关策略把数据刷新到磁盘中. 当redi ...

  6. Scala学习七——包和引入

    一.本章要点 包也可也可以像内部类那样嵌套 包路径不是绝对路径 包声明链x.y.z并不自动将中间包x和x.y变成可见 位于文件顶部不带花括号的包声明在整个文件范围内有效 包对象可以持有函数和变量 引入 ...

  7. Java Web ClassLoader工作机制

    一.ClassLoader的作用: 1.类加载机制:父优先的等级加载机制 2.类加载过程 3.将Class字节码重新解析成JVM统一要求的对象格式 二.ClassLoader常用方法 1.define ...

  8. 进阶Java编程(13)反射与Annotation

    1,反射取得Annotation信息 从JDK1.5之后Java提供了Annotation技术支持,这种技术为项目的编写带来了新的模型,而后经过了十年的发展,Annotation的技术得到了非常广泛的 ...

  9. 换发型app任性扣费?苹果app订阅任性扣费?怎么办?刚成功

    2019年9月18日17:09:27 什么黑猫举报没用 先关闭订阅 账户中心自助申请试试,不通过再进行下面这步 https://getsupport.apple.com/?caller=home&am ...

  10. MySQL四舍五入函数ROUND(x)、ROUND(x,y)和TRUNCATE(x,y)

    MySQL四舍五入函数ROUND(x) ROUND(x)函数返回最接近于参数x的整数,对x值进行四舍五入. 实例: 使用ROUND(x)函数对操作数进行四舍五入操作.SQL语句如下: mysql> ...