您的位置:首页 > 行业 >

(ex)BSGS/(扩展)大步小步算法 学习笔记 环球滚动

2023-06-04 18:17:26 来源: 博客园

#(ex)BSGS/(扩展)大步小步算法学习笔记在即将暂时退役之际杀掉了[P41

(ex)BSGS/(扩展)大步小步算法 学习笔记

在即将暂时退役之际杀掉了P4195的毒瘤模板题,于是来写篇学习笔记。

谨此为我初中三年摆烂的OI生涯画上一个句号。(距离中考还有20天!)


(资料图)

BSGS

link

求\(a^x\equiv b\pmod p\)的非负整数解,其中\(a, p\)互质。

算法思路

我们不妨令\(t=\lceil{\sqrt{p}\rceil}\),\(j\lt t\),\(i\leq t\)

原式转化为\(a^{it-j} \equiv b \pmod p\)

即 \(\left(a^t\right)^i\equiv b\cdot a^j \pmod p\)

于是我们可以这么在\(\Theta\left(\sqrt{n}\right)\)(不考虑hash表)内求出解:

  • 枚举\(j \in [0, t)\),求出所有的\(b\cdot a^j \mod p\),用hash表记录下来

  • 枚举\(i \in [0, t]\),求出所有的\(\left(a^t\right)^i \mod p\),在hash表中查找是否有对应的\(j\)值

需要注意的是,当\(a^t \mod p=0\)时,若\(b=0\),则解为\(x=1\);否则无解。

正确性讨论

由Euler定理,我们有\(a^{\varphi\left(p\right)}\equiv 1\pmod p\),其中\(\varphi\left(x\right)\)为Euler函数。

也就是说,\(\mod p\)意义下,\(a^x\mod p\)在\(x=n\cdot\varphi\left(p\right)\)(\(n\)遍历非负整数)后循环。

我们知道对于任意整数\(x \gt 1\),\(x>\varphi\left(x\right)\),而我们取的\(it-j\)可以遍历\([0, x]\),因此能够取到\(a^x \mod p\)的一切情况,故一定不会漏解。

代码实现

#include using namespace std;#define int long longint qpow(int a, int n, int p) {    a%=p;    int res=1;    while (n) {        if (n&1) res=res*a%p;        a=a*a%p;        n>>=1;    }    return res;}signed bsgs(int a, int b, int p) {    b%=p;    int t=sqrt(p)+1;    unordered_map hash; hash.clear();    for (int j=0; j=0 && i*t-j>=0) return i*t-j;    }    return -1;}signed main() {    int a, b, p;    cin>>p>>a>>b;    int res=bsgs(a,b,p);    if (res==-1) puts("no solution");    else cout<

这份代码是可以通过P3846的。我们可以考虑对它进行优化。

我们发现枚举\(a^j\)和\(\left(a^t\right)^i\)的时候,\(i, j\)是递增的,于是我们可以直接用一个变量来维护\(a^j\)和\(\left(a^t\right)^i\)。

另外,用unordered_map来实现hash表似乎会快一些。

inline int bsgs(int a, int b, int p) {    int t=(int)(sqrt(p))+1;    unordered_map h; h.clear();    int powa=1;    for (reg int j=0; j=0 && i*t-j>=0) return i*t-j;        powa=powa*a%p;    }    return -1;}

为exBSGS进行修改

我们现在来考虑\(ka^x\equiv b\pmod p\)(\(a, p\)互质,\(k\)为正整数)的式子,我们可以同样地将它们变形为

\[k\cdot \left(a^t\right)^i\equiv b\cdot a^j \pmod p\]

于是稍微修改一下上述代码就可以了。

inline int bsgs(int a, int b, int k, int p) {    int t=(int)(sqrt(p))+1;    unordered_map h; h.clear();    int powa=1;    for (reg int j=0; j=0 && i*t-j>=0) return i*t-j;        powa=powa*a%p;    }    return -1;}

exBSGS

link

求\(a^x\equiv b\pmod p\)的非负整数解,其中\(a, p\)未必互质

算法思路

考虑利用同余式的约化性质,转换成朴素的BSGS来求解。

我们有如下同余式的约化性质:若\(a\equiv b\pmod p\),\(d\mid a,d \mid b\),则

\(\frac{a}{d}\equiv\frac{b}{d}\pmod {\frac{p}{\gcd(d,p)}}\)

我们回到\(a^x\equiv b\pmod p\),令\(d_1=\gcd(a,p)\),当\(d_1 \mid b\),我们可以变形为\(\frac{a}{d_1}\cdot a^{x-1}\equiv \frac{b}{d_1} \pmod {\frac{p}{d_1}}\)(若\(d_1 \nmid b\),立刻得出无解)若\(a,\frac{p}{d_1}\)仍不互质,我们可以继续令\(d_2=\gcd(a,\frac{p}{d_1})\),\(\cdots\),直到\(a,\frac{p}{d_1d_2\cdots d_k}\)互质为止。

我们设一共进行了\(k\)次约化,\(D=d_1d_2\cdots d_k\)(此时\(a\),\(\frac{p}{D}\)互质),原式可变形为

\(\frac{a^k}{D}\cdot a^{x-k} \equiv \frac{b}{D} \pmod {\frac{p}{D}}\)

我们令\(k=\frac{a^k}{D}, X=x-k, B=\frac{b}{D}, P=\frac{p}{D}\),即

\(ka^X\equiv B \pmod P\)

于是可以利用修改后的BSGS算法来求解。

注意求解之后得到\(X=x-k\),故\(x=X+k\)。

Trick

\(\frac{a^k}{D}=\frac{a}{d_1}\frac{a}{d_2}\cdots\frac{a}{d_k}\),于是可以在每一个循环内单独计算。

cout<<"\n"似乎会比用cout<快一些。

可以预先将b%=p, a%=p,若取模过后\(b==1\)或者\(p==1\),那么显然\(x=0\)为解。

我们记\(D_k=\frac{a}{d1}\frac{a}{d2}\cdots \frac{a}{d_k}\),当\(\frac{a^k}{D^k}==\frac{b}{D_k}\)时,有

\[\frac{a^k}{D_k}\cdot a^{x-k}\equiv \frac{b}{D_k}\pmod {\frac{p}{D_k}}\]

\[a^{x-k}\equiv 1\pmod {\frac{p}{D_k}}\]

于是\(x=k\)为解。其中\(k\)是正在进行的第\(k\)次约化。

代码实现

#include using namespace std;#define int long long#define reg registerinline int qpow(int a, int n, int p) {    a%=p; int res=1;    while (n) {        if (n&1) res=res*a%p;        a=a*a%p; n>>=1;    }    return res;}inline int bsgs(int a, int b, int k, int p) {    int t=(int)(sqrt(p))+1;    unordered_map h; h.clear();    int powa=1;    for (reg int j=0; j=0 && i*t-j>=0) return i*t-j;        powa=powa*a%p;    }    return -1;}inline int exbsgs(int a, int b, int p) {    a%=p, b%=p;    if (b==1 || p==1) return 0;    int A=a, NA=1, B=b, P=p, k=0, D=1;    while (__gcd(a,P)>1) {        int d=__gcd(a,P);        if (B%d) return -1;        k++; A/=d, B/=d, P/=d, NA=NA*(a/d)%P, D=D*d%P;        if (NA==B) return k; // NA就是上文提到的(a^k)/(D^k)    }    int res=bsgs(a,B,NA,P);    if (res==-1) return res;    if ((qpow(a,res+k,p)-b)%p) return -1;    return res+k;}signed main() {    ios::sync_with_stdio(false);    cin.tie(NULL); cout.tie(NULL);    int a, b, p;    while (cin>>a>>p>>b && a) {        int res=exbsgs(a,b,p);        if (res==-1) cout<<"No Solution\n";        else cout<

Record,\(2.46\rm{s}\),可以通过本题(包括Hack数据)。

后记

这道题算是比较毒瘤的,我是一共调了三天才过的(我太弱了)还有\(20\)天就要中考了,而我还在这摸鱼(悲)就谨此纪念一下我的初中OI生涯罢。

顺便在此祝福向宴酱中考顺利!

关键词:

精选 导读

电放提单是什么意思 海运提单中的电放是什么意思-每日时讯

1、是指托运人(发货人)将货物装船后将承运人(或其代理人)所签发的

发布时间: 2023-06-03 19:47
互联网   2023-06-03

【焦点热闻】错峰出行的意思 错峰出行的含义

1、错峰出行是一个组合词,意思是错开高峰时段出行。2、错峰释义:错开

发布时间: 2023-06-03 19:41
互联网   2023-06-03

环球讯息:造纸术是谁发明 造纸术的发明者是谁

造纸术是蔡伦发明的,东汉元兴元年,蔡伦改进了造纸术,他用树皮、麻头

发布时间: 2023-06-03 19:45
互联网   2023-06-03

花开花落花满天歌词 花开花落花满天是什么歌里的词

1、歌词:花谢花飞飞满天红消香断有谁怜游丝软系飘春榭落絮轻沾扑绣帘

发布时间: 2023-06-03 19:48
互联网   2023-06-03

绣球花的养殖方法,3个小步骤搞定

1、剪取一株成熟绣球的顶端嫩枝,长20厘米左右,摘去下部叶片,扦插到

发布时间: 2023-06-03 19:53
互联网   2023-06-03

【环球聚看点】rectangle是什么意思(a rectangle是什么意思)

1、Rectangle是一个英语单词,名词,作名词时意为“矩形;长方形”。2

发布时间: 2023-06-03 19:55
互联网   2023-06-03

微信如何群发消息但不建群

1、打开手机上微信进入,选择右下角的我,选择设置。2、点击通用,选择

发布时间: 2023-06-03 19:42
互联网   2023-06-03

全球快讯:怎么鉴别缅甸玉(怎么鉴别缅甸玉手镯真假)

1、掂重量。鉴别缅甸玉的真假时,可以将它放在手上上下晃动掂量重量,

发布时间: 2023-06-03 19:52
互联网   2023-06-03

如何设置无线路由器 为大家普及一下_天天播资讯

1、无线路由器怎么设置方法步骤2、进入路由器的设置主页3、现在进入了

发布时间: 2023-06-03 19:41
互联网   2023-06-03

热点评!怎么学唱歌的基本功 怎么学唱歌

1、练自己的肺活量,多游泳,多跑步!多看一些音乐录影带,看一下其他

发布时间: 2023-06-03 19:45
互联网   2023-06-03

热门TAG

more
中国外贸网简介 重磅突发!王思聪在上海打人?警方刚刚通报 女子随手捐10元4个月后收到还款道谢 看到回复破防 国内猪肉价格开启新一轮周期?专家:国家调控政策正在起作用 彩电市场价格持续走低:50英寸千元轻松购还会降价吗? 鹤岗中介谈1.5万全款买房:别冲动 详情曝光系40年房龄的老房子价格自然便 稳外贸 福建拓“新”途 福建也积极开辟国际物流新通道 这条名为BarMar的能源运输路线以帮助缓解欧洲所面临的能源危机 宁波银行:聚焦主责主业,更好服务实体经济 重磅利好!涉房企业A股融资审核放宽,“白名单”浮出水面 能源是经济发展的动力源泉 美国经济萧条对汽车和电力市场的冲击力有多 多头酝酿更大爆发!美元有望再大涨近百点 广西北部湾畔崛起国际大港 商企耕耘十年等来春暖花开时 中国A股半导体板块周四大涨 十年时间增长超1200亿元 2021年创造天津市进出口历史最高纪录 天津口岸完成进出口贸易值2381亿美元 较2012年增长16.6% 深圳机场口岸通过发挥东南亚航线优势 不断丰富进口水果品类 国际航线(含港澳台)日均执行客运航班量达143班次 创今年新高 待中吉乌铁路建成后 将高效联通中欧班列的中通道与南通道线路 中国与RCEP成员国经过陆海新通道进出口总量52068标箱 国航已率先在空客、波音机型上开展可持续航空燃料应用 中国制造业屡创奇迹 牢牢站稳世界“C位” 今年新疆不断加大能源增产增供力度 新疆煤炭产量增长31.1%、排全国第2位 陶悦群计划围绕大健康等产业进行增资扩产 光伏电站位于Kharsaa地区 是卡塔尔首个太阳能发电厂 过去十年,重庆工业增加值总额由2012年的4291.4亿元提高至2021年的7888.7亿元 2021年盐湖化工产业实现产值331.8亿元 增长46.2% 切入储能赛道的消费电池头部玩家德赛电池近两日连续打板涨停 6个二线城市首套房贷款利率跌破4% 低至3.8% 倡议项目将由德国联邦经济和气候保护部的能源研究预算提供资金