模板:BSGS(数论)

所谓 BSGS,就是北上广深。

(逃)

BSGS

给出 a,b,pa,b,pa,b,p,请处出满足 ax≡b(modp)a^x\equiv b\pmod paxb(modp) 的最小非负正数解或者报告无解。
a,b,p≤109,gcd⁡(a,p)=1a,b,p\le 10^9,\gcd(a,p)=1a,b,p109,gcd(a,p)=1

由于 a,pa,pa,p 互质,有 aφ(p)≡1(modp)a^{\varphi(p)}\equiv 1\pmod paφ(p)1(modp),所以答案如果存在,不会超过 O(p)O(p)O(p) 级别。
w=⌈p⌉w=\lceil \sqrt{p} \rceilw=pxxx 可以拆分为 xw−y(x,y≤p)xw-y \pod {x,y\le \sqrt p}xwy(x,yp)
变一下型:
axw−y≡b(modp)a^{xw-y}\equiv b\pmod paxwyb(modp)
axw≡b⋅ay(modp)a^{xw}\equiv b\cdot a^y\pmod paxwbay(modp)
先枚举右边存到 map 或者哈希表里,然后左边暴力查表即可。

ll bsgs(ll a,ll b,ll mod){if(b==0&&a==0) return 1;if(b==1) return 0;if(a==0||b==0) return -1;mp.clear();ll w=ceil(sqrt(mod)),ans=1e16;for(ll i=0,now=1;i<=w;i++,now=now*a%mod){int x=b*now%mod;mp.ins(x,i);}ll bas=ksm(a,w,mod);for(ll i=1,now=bas;i<=w;i++,now=now*bas%mod){int o=mp.find(now);if(o!=-1) ans=min(ans,i*w-o);}return ans>1e15?-1e9:ans;
}

exBSGS

给出 a,b,pa,b,pa,b,p,请处出满足 ax≡b(modp)a^x\equiv b\pmod paxb(modp) 的最小非负正数解或者报告无解。
a,b,p≤109a,b,p\le 10^9a,b,p109

没有 a,pa,pa,p 互质的条件,之前的算法行不通了。
因此我们要试图转化为互质的情况。

一个朴素的想法是同时除以 gcd⁡\gcdgcd
但是我们如果改变了 aaa,后面会很难搞。
有一个性质,如果有:
a≡b(modp)a\equiv b\pmod pab(modp)
那么对于 a,b,pa,b,pa,b,p 的公因数 ggg,有:
ag≡bg(modpg)\frac{a}{g}\equiv \frac{b}{g}\pmod {\frac{p}{g}}gagb(modgp)
带回方程:
ax−1⋅ag≡bg(modpg)a^{x-1}\cdot\frac{a}{g}\equiv \frac{b}{g}\pmod {\frac{p}{g}}ax1gagb(modgp)
ax−1≡bg⋅ag(modpg)a^{x-1}\equiv \frac{b}{g\cdot\frac{a}{g}}\pmod {\frac{p}{g}}ax1ggab(modgp)
就对方程完成了转化。
但是,这样只是对 pppggg 后,依然有可能 p,ap,ap,a 不互质。
那么我们就找到新的 ggg,直到互质为止。
假设除了 kkk 次,就有:
ax−k≡b(∏kgk)⋅∏kagka^{x-k}\equiv \frac{b}{(\prod_kg_k)\cdot\prod_k\frac{a}{g_k}}axk(kgk)kgkab
右边的分母在实现时是分开除的,所以这里也不化简了)
但是我们需要注意一些细节问题。

  1. 如果 gcd⁡(a,p)\gcd(a,p)gcd(a,p) 不是 bbb 的因子怎么办?

如果 a,pa,pa,pggg 的倍数,那么 axmodpa^x\bmod paxmodp 必然也是 ggg 的倍数(可以把取模理解成减倍数来考虑),那么既然无解。(除非 b=1 !

  1. ppp 不是质数,如何求 ∏kagk\prod_k\frac{a}{g_k}kgka 的逆元?

如果 a,pa,pa,p 互质,那么 ∏kagk\prod_k\frac{a}{g_k}kgka (也就是 aaa 的一堆因子乘起来)必然也与 ppp 互质,用 exgcd\mathrm{exgcd}exgcd 求解即可。

代码

inline ll ksm(ll x,ll k,ll mod){//快速幂ll res(1);while(k){if(k&1) res=1ll*x*res%mod;x=1ll*x*x%mod;k>>=1;}return res;
}
struct node{int to,nxt;
};
struct Hash{//哈希表int mod,key[N],val[N],tot,cnt;bool vis[N];  vector<int> exi;int fi[N];node p[N];inline void init(int x){mod=x;memset(fi,-1,sizeof(fi));cnt=-1;}void ins(int k,int w){int o=k%mod;if(!vis[o]){vis[o]=1;exi.push_back(o);}for(int i=fi[o];~i;i=p[i].nxt){int to=p[i].to;if(key[to]==k){val[to]=w;return;}}++tot;val[tot]=w;key[tot]=k;p[++cnt]=(node){tot,fi[o]};fi[o]=cnt;}int find(int k){int o=k%mod;for(int i=fi[o];~i;i=p[i].nxt){int to=p[i].to;if(key[to]==k) return val[to];}    return -1;}void clear(){for(int x:exi){fi[x]=-1;vis[x]=0;}tot=0;cnt=-1;exi.clear();return;}
}mp;
ll bsgs(ll a,ll b,ll mod){if(b==0&&a==0) return 1;if(b==1) return 0;if(a==0||b==0) return -1;mp.clear();ll w=ceil(sqrt(mod)),ans=1e16;for(ll i=0,now=1;i<=w;i++,now=now*a%mod){int x=b*now%mod;mp.ins(x,i);}ll bas=ksm(a,w,mod);for(ll i=1,now=bas;i<=w;i++,now=now*bas%mod){int o=mp.find(now);if(o!=-1) ans=min(ans,i*w-o);}return ans>1e15?-1e9:ans;
}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}//gcd
ll exgcd(ll x,ll y,ll &a,ll &b){//exgcdif(!y){a=1;b=0;return x;}ll g=exgcd(y,x%y,a,b),tmp=a;a=b;b=tmp-x/y*b;return g;
}
ll inv(ll x,ll mod){//x的逆元ll a,b;ll g=exgcd(x,mod,a,b);assert(g==1);a=(a%mod+mod)%mod;return a;
}
ll a,b,w;
ll ans=1e18;
ll exbsgs(ll a,ll b,ll mod){//exbsgsif(b==1||mod==1) return 0;ll k(0),g=gcd(a,mod),na=1;while(g>1){++k;    if(b%g) return -1;b/=g;mod/=g;na=na*a/g%mod;g=gcd(mod,a);if(b==na) return k;//此时b变成了1}return bsgs(a,b*inv(na,mod)%mod,mod)+k;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在ASP.NET Core中自定义Azure Storage File Provider

主题&#xff1a;如何在ASP.NET Core中自定义Azure Storage File Provider作者&#xff1a; Lamond Lu地址: https://www.cnblogs.com/lwqlun/p/10406566.html项目源代码&#xff1a; https://github.com/lamondlu/AzureFileProvider背景ASP.NET Core是一个扩展性非常高的框架…

splay/fhq-treap 问卷调查反馈—— [JSOI2008]火星人prefix(splay),Strange Queries(fhq-treap)

文章目录[JSOI2008]火星人prefixStrange Queries[JSOI2008]火星人prefix BZOJ1014 思路很好想&#xff0c;哈希字符串即可 只是平衡树的码量大 注意因为splay加入哨兵的原因&#xff0c;每个点在平衡树内的排名比真实排名大111&#xff08;有极小值的占位&#xff09; 考虑…

AcWing 1091. 理想的正方形

AcWing 1091. 理想的正方形 题意&#xff1a; 有一个 ab 的整数组成的矩阵&#xff0c;现请你从中找出一个 nn 的正方形区域&#xff0c;使得该区域所有数中的最大值和最小值的差最小。 题解&#xff1a; 前置知识&#xff1a;已经学会了一维的单调队列优化dp 在本题中要求…

美好生活从撸好代码开始

楔子 昨天晚上做了个梦&#xff0c;梦到老板对我说了一番道理&#xff0c;他说对家庭要用爱心&#xff0c;做人对社会要有包容心&#xff0c;对工作要有责任心&#xff0c;对老板要有同理心。 我深以为然。现在的老板确实太不容易了&#xff0c;尤其是作为一家承载梦想&#xf…

模板:莫比乌斯反演(数论)

文章目录前言整除分块代码积性函数线性筛狄利克雷卷积莫比乌斯反演trick所谓莫比乌斯反演&#xff0c;就是莫比乌斯进行的反演 &#xff08;逃&#xff09; 前言 在一些需要整除的式子和 gcd⁡,lcm⁡\gcd,\operatorname{lcm}gcd,lcm 等问题中发挥作用。 整除分块 整除分块是…

[TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)

2021-09-07 test[TJOI2013]拯救小矮人「ICPC World Finals 2019」Hobson 的火车[TJOI2013]拯救小矮人 luogu4823 考试题目的数据加强为2e5&#xff0c;所以此题做法应为O(nlog⁡n)O(n\log n)O(nlogn)的反悔贪心 这种有多元属性&#xff0c;选择最优的问题 如果发现简单的贪心…

Dotnet全平台下APM-Trace探索

随着支撑的内部业务系统越来越多&#xff0c;向着服务化架构进化&#xff0c;在整个迭代过程中&#xff0c;会逐渐暴露出以下问题。传统依赖于应用服务器日志等手段的排除故障原因的复杂度越来越高&#xff0c;传统的监控服务已经无法满足需求。终端--> Nginx --> IIS --…

生成函数全家桶

文章目录有用的式子1.&#xff08;牛顿二项式定理&#xff09;2.普通生成函数&#xff08;OGF&#xff09;常见封闭形式&#xff1a;1.2.3.4.指数生成函数&#xff08;EGF&#xff09;排列与圆排列有用的式子 1.&#xff08;牛顿二项式定理&#xff09; 我们把组合数的定义推…

2020年牛客多校第五场C题-easy(纯组合计数不要生成函数的做法)

文章目录descriptionsolutioncodedescription 有TTT组测试数据 对于两个长度为KKK的数列{a}\{a\}{a}和{b}\{b\}{b}&#xff0c;满足∑i1KaiN,∑i1KbiM\sum_{i1}^Ka_iN,\sum_{i1}^Kb_iM∑i1K​ai​N,∑i1K​bi​M 对于这两个数列&#xff0c;定义权值为P∏i1Kmin⁡(ai,bi)P\p…

部署Chart应用并使用.net core读取Kubernetes中的configMap

上一篇文章讲了 k8s使用helm打包chart并上传到腾讯云TencentHub&#xff0c;今天就讲一下使用Helm部署应用并使用configMap代替asp.net core 中的appsettings.json文件。把Chart上传到TencentHub之后&#xff0c;我们就可以通过腾讯云的容器服务&#xff0c;直接部署Helm应用了…

Vases and Flowers HDU - 4614

Vases and Flowers HDU - 4614 题意: 一排空瓶子放花&#xff0c;操作1&#xff1a;从第x个瓶子开始放花&#xff0c;放y朵花&#xff0c;每个瓶子就一朵花&#xff0c;如果碰到已经有花的瓶子跳过这个瓶子&#xff0c;看下一个&#xff0c;当花没了&#xff0c;或者瓶子不够…

洛谷P3327:[SDOI2015]约数个数和(莫比乌斯反演)

枚举倍数的一种灵活的变形&#xff1a;g(d)∑d∣inf(i)∑i1⌊nd⌋f(i⋅d)g(d)\sum_{d|i}^nf(i)\sum_{i1}^{\lfloor\frac{n}{d}\rfloor}f(i\cdot d)g(d)∑d∣in​f(i)∑i1⌊dn​⌋​f(i⋅d) 很显然&#xff0c;但有时能发挥大作用。 其实本质还是要理解西格玛究竟是在算什么 解析…

EFCore Lazy Loading + Inheritance = 干净的数据表 (一)

前言α角 与 β角关于α角 与 β角的介绍&#xff0c;请见上文 如何用EFCore Lazy Loading实现Entity Split。本篇会继续有关于β角的彩蛋在等着大家去发掘。/斜眼笑其他本篇的程序&#xff0c;可以在 https://github.com/kentliu2007/EFCoreDemo/tree/master/InheritanceWithE…

专题突破之反悔贪心——建筑抢修,Cow Coupons G, Voting (Hard Version),Cardboard Box

文章目录[JSOI2007]建筑抢修[USACO12FEB]Cow Coupons GCF1251E2 Voting (Hard Version)CF436E Cardboard Box[JSOI2007]建筑抢修 luogu4053 将建筑按照结束时间从小到大排序 然后记录一下已经修理的建筑总共的花费时间 如果花费时间加上现在这个建筑的修建时间超过了这个建…

Max Sum Plus Plus HDU - 1024

Max Sum Plus Plus HDU - 1024 题意&#xff1a; 给你n个数&#xff0c;选m个子段&#xff0c;各个子段连续且不相交&#xff0c;长度可以为1&#xff0c;设maxn为各个子区间的和&#xff0c;求最大的maxn。 题解&#xff1a; 设dp[i][j]表示前j个数分成i段的最大值 对于第…

模板:杜教筛(莫比乌斯反演、数论)

所谓杜教筛&#xff0c;就是dms教给我们的筛 &#xff08;逃&#xff09; 前言 与其说算法&#xff0c;不如说是技巧。 可以在低于线性的时间复杂度&#xff08;准确的说是 O(n23)O(n^{\frac{2}{3}})O(n32​)&#xff09;内完成对积性函数的前缀和计算。 解析 考虑求函数 f…

程序员过关斩将--快速迁移10亿级数据

菜菜呀&#xff0c;咱们业务BJKJ有个表数据需要做迁移程序员主力 Y总现在有多少数据&#xff1f;菜菜大约21亿吧&#xff0c;2017年以前的数据没有业务意义了&#xff0c;给你半天时间把这个事搞定&#xff0c;绩效给你A程序员主力 Y总有绩效奖金吗&#xff1f;菜菜钱的事你去问…

[2021-09-09 T2] 就差⼀点——冒泡排序和反序表之间不为人知的秘密

就差一点解题报告descriptionsolutioncodedescription 题目描述 冒泡排序是⼀个简单的排序算法&#xff0c;其时间复杂度为O(n2)O(n^2)O(n2) 有⼀个大小为nnn的排列p1,...,pnp_1,...,p_np1​,...,pn​&#xff0c;⼩明想对这个排列进⾏冒泡排序&#xff0c;于是写了下⾯这份…

CodeForces - 76E Points

CodeForces - 76E Points 题意&#xff1a; 给你n个点的坐标&#xff0c;求所有一对点之间的距离的平方和 n<100000 题解&#xff1a; 直接暴力n2肯定不行&#xff0c;我们把这个的式子列出来&#xff1a; 代码&#xff1a; #include<bits/stdc.h> #define deb…

模板:Miller-RabinPollard-Rho(数论)

所谓 pollard-rho&#xff0c;就是泼辣的肉 &#xff08;逃&#xff09; 前言 许多题解都把这两个算法放在了一起。 那我也这样办吧&#xff01; miller-rabin可以在优秀的时间复杂度内完成对一个数的素性检测。 而pollard-rho则是立足于Miler-rabin之上&#xff0c;可以在 …