BSGS

(感觉这东西还是要写一下)

BSGS主要用于求解形如\(x^k=y\pmod p\)(注意这里p与x互质)这样的方程的最小正整数解的问题

设\(m=\lceil\sqrt p\rceil,k=am-b,a\in[1,m],b\in[0,m)\)

那么上面的方程可以变形成\(x^{am}=yx^b\pmod p\)

枚举\(b\),计算出右边的值存到\(map\)中,枚举\(a\)查表即可

Q:可以枚举左边存表,右边查嘛?

A:可以,但是左边查到表可以直接输出...

顺便一说,map里要存最大值,这样你算出的答案是最小的,所以能更新就更新

复杂度:\(O(\sqrt plogp)\)

模板题[TJOI2007]可爱的质数

#include<bits/stdc++.h>
using namespace std;
int p;
map<int,int>M;
int ksm(int x,int y){
int s=1;
while(y){if(y&1)s=1ll*s*x%p;x=1ll*x*x%p;y>>=1;}
return s;
}
int main(){
int x,y;
cin>>p>>x>>y;
int m=sqrt(p)+1;
int s=y;
for(int i=0;i<m;i++){
M[s]=i;//能更新就更新
s=1ll*s*x%p;
}
int t=ksm(x,m);s=1;
for(int i=1;i<=m;i++){
s=1ll*s*t%p;
if(M.count(s)){printf("%d\n",i*m-M[s]);return 0;}
}
puts("no solution");return 0;
}

扩展BSGS

当p不是素数时(这时x,p不一定互质),

设d=gcd(x,p),

若d不整除y,那么只有y=1时,x=0,其他情况均无解

若d整除y,当d=1时,直接BSGS

否则有$$x^k=y\pmod p$$

\[x^{k-1}×\frac{x}{d}=\frac{y}{d}\pmod{\frac{p}{d}}
\]

继续分解到d=1为止.

\[x^{k-t}×\frac{x^t}{\prod d_i}=\frac{y}{\prod d_i}\pmod{\frac{p}{\prod d_i}}
\]

然后首先检验x=[0,t)是否为解,显然t是log级别的

如果[0,t)都不是解,由于\(x,\frac{p}{\prod d_i}\)互质,BSGS求解即可

最后记得答案加上t啊

模板题[SPOJ3105]MOD

#include<bits/stdc++.h>
using namespace std;
int re(){
int x=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
int p;
map<int,int>M;
void mul(int&x,int y){x=1ll*x*y%p;}
int ksm(int x,int y){
int s=1;
while(y){if(y&1)mul(s,x);mul(x,x);y>>=1;}
return s;
}
void exbsgs(int x,int y){
if(y==1){puts("0");return;}
int d=__gcd(x,p),k=1,t=0;
while(d^1){
if(y%d){puts("No Solution");return;}
++t;y/=d;p/=d;mul(k,x/d);
if(y==k){printf("%d\n",t);return;}
d=__gcd(x,p);
}
int s=y;M.clear();int m=sqrt(p)+1;
for(int i=0;i<m;i++){
M[s]=i;mul(s,x);
}
s=k;k=ksm(x,m);
for(int i=1;i<=m;i++){
mul(s,k);
if(M[s]){printf("%d\n",i*m-M[s]+t);return;}
}
puts("No Solution");
}
int main(){
int x,y;
while(1){
x=re(),p=re(),y=re();
if(!x&&!p&&!y)break;
x%=p;y%=p;
exbsgs(x,y);
}
return 0;
}

[note]BSGS & exBSGS的更多相关文章

  1. BSGS&EXBSGS 大手拉小手,大步小步走

    大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...

  2. BSGS&ExBSGS

    BSGS&ExBSGS 求解形如 \[a^x\equiv b\pmod p\] 的高次同余方程 BSGS 假装\(gcd(a,p)=1\). 设\(m=\lceil\sqrt p \rceil ...

  3. 算法笔记--BSGS && exBSGS 模板

    https://www.cnblogs.com/sdzwyq/p/9900650.html 模板: unordered_map<int, int> mp; LL q_pow(LL n, L ...

  4. BSGS && EXBSGS

    基础BSGS 用处是什么呢w 大步小步发(Baby-Step-Giant-Step,简称BSGS),可以用来高效求解形如\(A^x≡B(mod C)\)(C为素数)的同余方程. 常用于求解离散对数问题 ...

  5. BSGS+exBSGS POJ2417+POJ3243

    a^x=b(mod p)求x,利用分块的思想根号p的复杂度求答案,枚举同余式两端的变量,用hash的方法去找最小的答案(PS:hash看上去很像链式前向星就很有好感).然后如果p不是质数时,就利用同余 ...

  6. Noip前的大抱佛脚----数论

    目录 数论 知识点 Exgcd 逆元 gcd 欧拉函数\(\varphi(x)\) CRT&EXCRT BSGS&EXBSGS FFT/NTT/MTT/FWT 组合公式 斯特林数 卡塔 ...

  7. 各种友(e)善(xin)数论总集(未完待续),从入门到绝望

    目录 快速幂 扩展欧几里得 GCD 扩展欧几里得 同余系列 同余方程 同余方程组 一点想法 高次同余方程 BSGS exBSGS 线性筛素数 埃式筛 欧拉筛 欧拉函数 讲解 两道水题 法雷级数 可见点 ...

  8. REHの收藏列表

    搬运自本人的AcWing,所以那里的文章会挺多. 友链(同类文章) :bztMinamoto 世外明月 mlystdcall 新人手册:AcWing入门使用指南 前言 有看到好文欢迎推荐(毛遂自荐也可 ...

  9. ZROI 2019 暑期游记

    ZROI 游记 在自闭中度过了17天 挖了无数坑,填了一点坑 所以还是有好多坑啊zblzbl 挖坑总集: 时间分治 差分约束 Prufer序列 容斥 树上数据结构 例题C (和后面的例题) 点分 最大 ...

随机推荐

  1. Nginx include和Nginx指令的使用

    Nginx include和Nginx指令的使用 1.nginx include 主配置文件nginx.conf中指定包含其他扩展配置文件,从而简化nginx主配置文件,实现多个站点功能 [root@ ...

  2. hdu 1030 Delta-wave(数学题+找规律)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1030 Delta-wave Time Limit: 2000/1000 MS (Java/Others ...

  3. UVa 156 Ananagrams(STL,map)

     Ananagrams  Most crossword puzzle fans are used to anagrams--groups of words with the same letters ...

  4. python——SyntaxError:invalid syntax

    格式不对,tab 或空格的格式不统一导致

  5. 【BIEE】04_当维度表中的维不存在事实表中,需要展示所有维度并且数据类展示为0

    有时候,我们往往会存在这样的需求 例如:事实表的数据如下 EMP_FACT表示事实表,DIM_LEVEL是维度表 预期效果:(根据员工信息,分析各等级员工工资与员工个数) 我们在BIEE报表中新建报表 ...

  6. iOS代码覆盖率测试工具

    基于lcov-1.11的:CodeCoverage4iOS   阅读目录 环境准备 Xcode工程配置 构建并安装程序 收集代码覆盖率 过滤结果 合并多个Coverage.info⽂件⽣成覆盖率报告: ...

  7. 通用对话弹窗CommonDialog

    代码地址如下:http://www.demodashi.com/demo/12592.html 通用对话弹窗CommonDialog Version 1.0 Created by chenchangj ...

  8. SQL Server中LIKE和PATINDEX的用法

    在SQL Server中,能使用通配符的只有2个:LIKE.PATINDEX. 不过LIKE支持2种通配符转义,无限制最全面:而PATINDEX只支持最简单的通配符转义([]转义),限制较多. LIK ...

  9. CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放 《CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放》来自张戈博客

    张戈博客很久以前分享过一个CC攻击的防御脚本,写得不怎么样,不过被51CTO意外转载了.博客从此走上了经常被人拿来练手的不归之路. 当然,还是有不少朋友在生产环境使用,并且会留言询问相关问题.根据这些 ...

  10. ArrayList remove注意事项

    例子1: List<Integer>list=new ArrayList<>(); list.add(1); list.add(2); list.add(2); list.ad ...