[模板] 数学基础:快速幂/乘/逆元/exGCD/(ex)CRT/(ex)Lucas定理
方便复制
快速乘/幂
时间复杂度 \(O(\log n)\).
ll nmod;
//快速乘
ll qmul(ll a,ll b){
ll l=a*(b>>hb)%nmod*(1ll<<hb)%nmod;
ll r=a*(b&((1<<hb)-1))%nmod;
return (l+r)%nmod;
}
//快速幂
ll qpow(ll a,ll b){
ll res=1;
while(b){
if(b&1)res=res*a%nmod;
a=a*a%nmod;
b>>=1;
}
return res;
}
exgcd
内容
解不定方程 $ ax+by = c $
时间复杂度 \(O(\log n)\).
void exgcd(ll a,ll b,ll& x,ll& y,ll& d){ //a&b should > 0
b==0?(x=1,y=0,d=a):(exgcd(b,a%b,y,x,d),y-=x*(a/b));
}
//use
ll a,b,c;
ll m,x,y;
exgcd(a,b,x,y,m);
if(c%m!=0)cout<<"No\n"; //无解
else{
c/=m,x*=c,y*=c,a/=m,b/=m;
//令x取最小非负整数
x1=x%b;if(x1<0)x1+=abs(b);
y1=(c-a*x1)/b;
//令y取最小非负整数
y1=y%a;if(y1<0)y1+=abs(a);//(y>=0?y%a:y%a+abs(a));
x1=(c-b*y1)/a;
}
逆元
内容
求\(n * x \equiv 1 (mod m)\) 最小正整数解.
单个数
时间复杂度 \(O(\log n)\).
//1:qp(n,nmod-2)
//2
ll getv(ll n){return n<0?n+nmod:n;}
ll inv(ll n){
ll x,y,d;
exgcd(getv(n%nmod),p,x,y,d);
return x%p+(x<0?p:0);
}
线性求逆元
时间复杂度 \(O(n)\).
- 公式法(并不能记住板子)
- 阶乘法
利用下面的公式:
\]
\]
代码
ll fac[nsz],ifac[nsz];
void init(int bnd){
fac[0]=1;
rep(i,1,bnd)fac[i]=i*fac[i-1]%nmod;
ifac[bnd]=inv(fac[bnd]);
repdo(i,bnd-1,0){
ifac[i]=ifac[i+1]*(i+1)%nmod;
}
}
CRT
中国剩余定理 && 扩展中国剩余定理 - niiick - CSDN博客
内容
解线性同余方程组 \(x \equiv a_i \pmod{m_i}, \forall i \in \{1, 2, \cdots , n\}\). 其中\(m_i\)两两互质.
设\(M=\prod_{i=1}^nm_i\), \(M_i=\frac M{m_i}\);
\(M_i^{-1}\) 为 \(M_i\) 关于 \(\bmod m_i\)的逆元,
则可以构造出通解
时间复杂度 $O(n \cdot 逆元)$, 通常为 $O(n \log n)$.
### 代码
```
ll crt(ll a,ll m,ll m0){//m0 | m; (m0,m/m0)=1
return m/m0*inv(m/m0,m0)%m*a%m;
}
```
## excrt
模数不互质.
利用合并的思想求解.
时间复杂度$O(n \log n)$.
### 代码
```
ll excrt(ll *a,ll *m,ll n){
ll a0=a[1],m0=m[1],x,y,g;
rep(i,2,n){
g=exgcd(m0,m[i],x,y);
if((a[i]-a0)%g!=0)return -1;
x=(a[i]-a0)/g*x%(m[i]/g);
a0+=x*m0;
m0=m0/g*m[i];
a0%=m0;
}
return a0<0?(a0%m0+m0):(a0%m0);
}
```
## Lucas定理
[Lucas定理 - permui - 博客园](https://www.cnblogs.com/owenyu/p/6724560.html)
### 内容
求 $\binom n m \bmod p$, 保证$p \in \{ prime \}$.
设$n=(a_0a_1\dots a_k)_p$, $m=(b_0b_1\dots b_k)_p$, 有
$$ \binom n m\equiv \prod _{i=0}^k\binom {a_i} {b_i} \pmod p \]
也即
\]
递归求解.
时间复杂度 \(O(p \log_p n)\) , 或者 \(O(p)\) 预处理, \(O(\log_p n)\) 单次询问.
代码
ll c(ll n,ll m){
if(m<0||m>n)return 0;
return fact(n)*inv(fact(m)*fact(n-m)%p)%p;
}
ll lucas(int n,int m){//c(n,m)%p
return m?lucas(n/p,m/p)*c(n%p,m%p)%p:1;
}
exLucas
【知识总结】扩展卢卡斯定理(exLucas) - Inspector_Javert - CSDN博客
p为合数.
分解质因数+阶乘取模+组合数+excrt
注意如果计算 \(n! \bmod p^k\) 时如果计算 \(p^x\) 对结果的贡献, 将无法求逆元. 因此需要求 \(\frac{n!}{p^x} \bmod p^k\), 即忽略p的幂, 然后在求组合数时再乘回来.
码量++
复杂度太长... 当它是 \(O(p \log p)\) 好惹
代码
ll qpow(ll a,ll b,ll nmod){
ll res=1;
while(b){
if(b&1)res=res*a%nmod;
a=a*a%nmod;
b>>=1;
}
return res;
}
void exgcd(ll a,ll b,ll &x,ll &y,ll &d){
b?(exgcd(b,a%b,y,x,d),y-=x*(a/b)):(x=1,y=0,d=a);
}
ll inv(ll a,ll m){
ll x,y,d;
exgcd(a,m,x,y,d);
return x>=0?x%m:x%m+m;
}
ll crt(ll a,ll m,ll m0){//m0 | m; (m0,m/m0)=1
return m/m0*inv(m/m0,m0)%m*a%m;
}
ll fact(ll n,ll p,ll pk){//(n!/p^x)%(p^k)
if(n<=1)return 1;
ll ans=1,tmp=n%pk;
rep(i,1,pk){
if(i%p)ans=ans*i%pk;
}
ans=qpow(ans,n/pk,pk);
rep(i,1,tmp){
if(i%p)ans=ans*i%pk;
}
return ans*fact(n/p,p,pk)%pk;
}
ll c(ll n,ll m,ll p,ll pk){//c(n,m)%(p^k)
ll sum=0;
for(ll i=n;i;i/=p)sum+=i/p;
for(ll i=m;i;i/=p)sum-=i/p;
for(ll i=n-m;i;i/=p)sum-=i/p;
return qpow(p,sum,pk)*fact(n,p,pk)%pk*inv(fact(m,p,pk),pk)%pk*inv(fact(n-m,p,pk),pk)%pk;
}
ll fac[40][2],pf; //0 p; 1 pk
void getfac(ll n){
ll tmp=sqrt(n);
rep(i,2,tmp){
if(n%i==0){
fac[++pf][0]=i,fac[pf][1]=1;
while(n%i==0)n/=i,fac[pf][1]*=i;
}
}
if(n>1)fac[++pf][0]=n,fac[pf][1]=n;
}
ll exlucas(ll n,ll m,ll p){
ll ans=0;
getfac(p);
rep(i,1,pf){
ans=(ans+crt(c(n,m,fac[i][0],fac[i][1]),p,fac[i][1]))%p;
}
return ans;
}
[模板] 数学基础:快速幂/乘/逆元/exGCD/(ex)CRT/(ex)Lucas定理的更多相关文章
- HDU4869:Turn the pokers(快速幂求逆元+组合数)
题意: 给出n次翻转和m张牌,牌相同且一开始背面向上,输入n个数xi,表示xi张牌翻转,问最后得到的牌的情况的总数. 思路: 首先我们可以假设一开始牌背面状态为0,正面则为1,最后即是求ΣC(m,k) ...
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
- NOIP2011多项式系数[快速幂|组合数|逆元]
题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...
- ACM-ICPC 2018 焦作赛区网络预赛- L:Poor God Water(BM模板/矩阵快速幂)
God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...
- XTU 1260 - Determinant - [2017湘潭邀请赛A题(江苏省赛)][高斯消元法][快速幂和逆元]
是2017江苏省赛的第一题,当时在场上没做出来(废话,那个时候又不懂高斯消元怎么写……而且数论也学得一塌糊涂,现在回来补了) 省赛结束之后,题解pdf就出来了,一看题解,嗯……加一行再求逆矩阵从而得到 ...
- Codeforces1106F 【BSGS】【矩阵快速幂】【exgcd】
首先矩阵快速幂可以算出来第k项的指数,然后可以利用原根的性质,用bsgs和exgcd把答案解出来 #include<bits/stdc++.h> using namespace std; ...
- hdu-4990 Reading comprehension(快速幂+乘法逆元)
题目链接: Reading comprehension Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- 洛谷 P1226 【模板】快速幂||取余运算 题解
Analysis 快速幂模板,注意在最后输出时也要取模. 快速幂模板 inline ll ksm(ll x,ll y) { ll ans=; ) { ) { ans*=x; ans%=k; } x*= ...
- Codeforces 963 A. Alternating Sum(快速幂,逆元)
Codeforces 963 A. Alternating Sum 题目大意:给出一组长度为n+1且元素为1或者-1的数组S(0~n),数组每k个元素为一周期,保证n+1可以被k整除.给a和b,求对1 ...
随机推荐
- Ext.define(override)
Ext.define(override)作用是:定义类的补丁(扩展或重写) 有3中使用方法,见附件 Ext.define(override).zip
- Vue.js如何在一个页面调用另一个同级页面的方法
使用场景: 页面分为header.home.footer三部分,需要在home中调用header中的方法,这两个没有相互引入 官方给出方法: 需要在展示页里调用顶部导航栏页里的方法,两者之间没有引用关 ...
- 上海启动5G试用!104页PPT,为你深度解析5G终端的创新和机遇
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源:国泰君安证券 作者:分析师王聪.张阳.陈飞达 导读:2019年是5G元年,各大品牌将陆续推出5G ...
- MyCat | 分库分表实践
引言 先给大家介绍2个概念:数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式. 切分模式 一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之 ...
- Adapter刷新数据的坑
adapter刷新数据的时候,要能够刷新成功,要保证每次刷新的时候都是改变数据源. 于是,我这样做了,在适配器的构造方法里面写到: private List<ListBean> listI ...
- Fragment与Activity的生命周期对比
因为fragment是依赖于activity的,所以activity的创建相关都是先于fragment的,fragment的销毁相关都是先于activity的.
- Git 最佳实践:分支管理
5月份,为统一团队git分支管理规范,刚开始准备自己写,在网上搜了下,发现不少不错的git分支管理实践.最后我为团队选择了这个git分支管理实践 A successful Git branching ...
- CSS优先级的及其衡量标准CSS权重
一.背景 CSS有三大特性:层叠性.继承性.优先级. 而我们在给CSS定义样式的时候,经常出现两个及以上的规则应用在同一元素上,单该元素最终在浏览器呈现的效果是应用的哪个规则呢?这就要考虑优先级的问题 ...
- Python基础——0前言
python虽然这几年才兴起,但是已经是一门“老”语言了. python的诞生历史也很有趣.Python的创始人为Guido van Rossum(龟叔).1989年圣诞节期间,在阿姆斯特丹,Guid ...
- CSS---内外边距
1.内外边距含义 内边距是div边框内的距离.背景色会覆盖内边距,内边距会使宽高变大. 外边距是div边框外的距离.背景色不会覆盖外边距 内外边距都会撑高父元素,外边距会提高div与div之间的距离 ...