方便复制

快速乘/幂

时间复杂度 \(O(\log n)\).

  1. ll nmod;
  2. //快速乘
  3. ll qmul(ll a,ll b){
  4. ll l=a*(b>>hb)%nmod*(1ll<<hb)%nmod;
  5. ll r=a*(b&((1<<hb)-1))%nmod;
  6. return (l+r)%nmod;
  7. }
  8. //快速幂
  9. ll qpow(ll a,ll b){
  10. ll res=1;
  11. while(b){
  12. if(b&1)res=res*a%nmod;
  13. a=a*a%nmod;
  14. b>>=1;
  15. }
  16. return res;
  17. }

exgcd

内容

解不定方程 $ ax+by = c $

时间复杂度 \(O(\log n)\).

  1. void exgcd(ll a,ll b,ll& x,ll& y,ll& d){ //a&b should > 0
  2. b==0?(x=1,y=0,d=a):(exgcd(b,a%b,y,x,d),y-=x*(a/b));
  3. }
  4. //use
  5. ll a,b,c;
  6. ll m,x,y;
  7. exgcd(a,b,x,y,m);
  8. if(c%m!=0)cout<<"No\n"; //无解
  9. else{
  10. c/=m,x*=c,y*=c,a/=m,b/=m;
  11. //令x取最小非负整数
  12. x1=x%b;if(x1<0)x1+=abs(b);
  13. y1=(c-a*x1)/b;
  14. //令y取最小非负整数
  15. y1=y%a;if(y1<0)y1+=abs(a);//(y>=0?y%a:y%a+abs(a));
  16. x1=(c-b*y1)/a;
  17. }

逆元

内容

求\(n * x \equiv 1 (mod m)\) 最小正整数解.

单个数

时间复杂度 \(O(\log n)\).

  1. //1:qp(n,nmod-2)
  2. //2
  3. ll getv(ll n){return n<0?n+nmod:n;}
  4. ll inv(ll n){
  5. ll x,y,d;
  6. exgcd(getv(n%nmod),p,x,y,d);
  7. return x%p+(x<0?p:0);
  8. }

线性求逆元

时间复杂度 \(O(n)\).

  1. 公式法(并不能记住板子)
  2. 阶乘法

    利用下面的公式:

\[(n!)^{-1} = ((n+1)!)^{-1} \cdot (n+1)
\]

\[n^{-1} = (n!)^{-1} \cdot (n-1)!
\]

代码

  1. ll fac[nsz],ifac[nsz];
  2. void init(int bnd){
  3. fac[0]=1;
  4. rep(i,1,bnd)fac[i]=i*fac[i-1]%nmod;
  5. ifac[bnd]=inv(fac[bnd]);
  6. repdo(i,bnd-1,0){
  7. ifac[i]=ifac[i+1]*(i+1)%nmod;
  8. }
  9. }

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\)的逆元,

则可以构造出通解

\[ x \equiv \sum_{i=1}^k a_iM_iM_i^{-1} \pmod M $$.

时间复杂度 $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 \]

也即

\[\binom n m \equiv \binom {\lfloor \frac{n}{p}\rfloor} {\lfloor \frac{m}{p}\rfloor} \cdot \binom {n \bmod p} {m \bmod p} \pmod p
\]

递归求解.

时间复杂度 \(O(p \log_p n)\) , 或者 \(O(p)\) 预处理, \(O(\log_p n)\) 单次询问.

代码

  1. ll c(ll n,ll m){
  2. if(m<0||m>n)return 0;
  3. return fact(n)*inv(fact(m)*fact(n-m)%p)%p;
  4. }
  5. ll lucas(int n,int m){//c(n,m)%p
  6. return m?lucas(n/p,m/p)*c(n%p,m%p)%p:1;
  7. }

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)\) 好惹

代码

  1. ll qpow(ll a,ll b,ll nmod){
  2. ll res=1;
  3. while(b){
  4. if(b&1)res=res*a%nmod;
  5. a=a*a%nmod;
  6. b>>=1;
  7. }
  8. return res;
  9. }
  10. void exgcd(ll a,ll b,ll &x,ll &y,ll &d){
  11. b?(exgcd(b,a%b,y,x,d),y-=x*(a/b)):(x=1,y=0,d=a);
  12. }
  13. ll inv(ll a,ll m){
  14. ll x,y,d;
  15. exgcd(a,m,x,y,d);
  16. return x>=0?x%m:x%m+m;
  17. }
  18. ll crt(ll a,ll m,ll m0){//m0 | m; (m0,m/m0)=1
  19. return m/m0*inv(m/m0,m0)%m*a%m;
  20. }
  21. ll fact(ll n,ll p,ll pk){//(n!/p^x)%(p^k)
  22. if(n<=1)return 1;
  23. ll ans=1,tmp=n%pk;
  24. rep(i,1,pk){
  25. if(i%p)ans=ans*i%pk;
  26. }
  27. ans=qpow(ans,n/pk,pk);
  28. rep(i,1,tmp){
  29. if(i%p)ans=ans*i%pk;
  30. }
  31. return ans*fact(n/p,p,pk)%pk;
  32. }
  33. ll c(ll n,ll m,ll p,ll pk){//c(n,m)%(p^k)
  34. ll sum=0;
  35. for(ll i=n;i;i/=p)sum+=i/p;
  36. for(ll i=m;i;i/=p)sum-=i/p;
  37. for(ll i=n-m;i;i/=p)sum-=i/p;
  38. 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;
  39. }
  40. ll fac[40][2],pf; //0 p; 1 pk
  41. void getfac(ll n){
  42. ll tmp=sqrt(n);
  43. rep(i,2,tmp){
  44. if(n%i==0){
  45. fac[++pf][0]=i,fac[pf][1]=1;
  46. while(n%i==0)n/=i,fac[pf][1]*=i;
  47. }
  48. }
  49. if(n>1)fac[++pf][0]=n,fac[pf][1]=n;
  50. }
  51. ll exlucas(ll n,ll m,ll p){
  52. ll ans=0;
  53. getfac(p);
  54. rep(i,1,pf){
  55. ans=(ans+crt(c(n,m,fac[i][0],fac[i][1]),p,fac[i][1]))%p;
  56. }
  57. return ans;
  58. }

[模板] 数学基础:快速幂/乘/逆元/exGCD/(ex)CRT/(ex)Lucas定理的更多相关文章

  1. HDU4869:Turn the pokers(快速幂求逆元+组合数)

    题意: 给出n次翻转和m张牌,牌相同且一开始背面向上,输入n个数xi,表示xi张牌翻转,问最后得到的牌的情况的总数. 思路: 首先我们可以假设一开始牌背面状态为0,正面则为1,最后即是求ΣC(m,k) ...

  2. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

  3. NOIP2011多项式系数[快速幂|组合数|逆元]

    题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...

  4. 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 ...

  5. XTU 1260 - Determinant - [2017湘潭邀请赛A题(江苏省赛)][高斯消元法][快速幂和逆元]

    是2017江苏省赛的第一题,当时在场上没做出来(废话,那个时候又不懂高斯消元怎么写……而且数论也学得一塌糊涂,现在回来补了) 省赛结束之后,题解pdf就出来了,一看题解,嗯……加一行再求逆矩阵从而得到 ...

  6. Codeforces1106F 【BSGS】【矩阵快速幂】【exgcd】

    首先矩阵快速幂可以算出来第k项的指数,然后可以利用原根的性质,用bsgs和exgcd把答案解出来 #include<bits/stdc++.h> using namespace std; ...

  7. hdu-4990 Reading comprehension(快速幂+乘法逆元)

    题目链接: Reading comprehension Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K ( ...

  8. 洛谷 P1226 【模板】快速幂||取余运算 题解

    Analysis 快速幂模板,注意在最后输出时也要取模. 快速幂模板 inline ll ksm(ll x,ll y) { ll ans=; ) { ) { ans*=x; ans%=k; } x*= ...

  9. Codeforces 963 A. Alternating Sum(快速幂,逆元)

    Codeforces 963 A. Alternating Sum 题目大意:给出一组长度为n+1且元素为1或者-1的数组S(0~n),数组每k个元素为一周期,保证n+1可以被k整除.给a和b,求对1 ...

随机推荐

  1. vue项目中vscode格式化配置和eslint配置冲突

    问题描述 使用vscode开发vue项目的时候,从远端拉下一个新的项目后,安装完依赖后跑起项目时,发现直接报了一堆语法错误:包括换行.空格.单双引号.分号等各种格式问题 因为我的 vscode 安装使 ...

  2. 阿里巴巴AI Lab成立两年,都做了些什么?

    https://mp.weixin.qq.com/s/trkCGvpW6aCgnFwLxrGmvQ 撰稿 & 整理|Debra 编辑|Debra 导读:在 2018 云栖人工智能峰会上,阿里巴 ...

  3. MongoDB在Linux下常用优化设置

    MongoDB在Linux下常用优化设置 以下是一些MongoDB推荐的常用优化设置.在生产环境下选取合适的参数值,例如预读值和默认文件描述符数目等,会对系统性能有很大的影响. 1.关闭数据库文件的 ...

  4. Git:八、Git自定义:忽略特殊文件&配置别名

    1..gitignore配置文件 1)防止加入Git或输入git status时显示,需要让Git忽略的文件: 程序编译生成的非原代码的文件 存放密码的文件 2)配置文件:.gitignore Git ...

  5. Hadoop3新特性

    1.添加Classpath isolation,防止不同版本的jar包出现冲突. 2.支持Shell重写. 3.支持HDFS中的擦除编码[Erasure Encoding],默认的EC策略可以节省50 ...

  6. MySQL分数排名同分并列与不并列查询

    Scores表 | Id | Score | | 3.50 | | 3.65 | | 4.00 | | 3.85 | | 4.00 | | 3.65 | 并列 | Score | Rank | | | ...

  7. SQL Server查看视图定义总结

      在SQL Server中如何查看数据库视图的定义呢? 其实官方文档已经有一个较详细的总结了,这里在官方文档的基础上,我们再深入展开分析一下,例如如何获取系统视图的定义.知其然知其所以然吗. 1:使 ...

  8. js实现横向跑马灯效果

    首先我们需要一个html代码的框架如下: <div style="position: absolute; top: 0px; left: 168px; width: 100%; mar ...

  9. LinuxMint上安装redis和python遇到的一些问题

    今天在安装Redis和Python上遇到了些问题,解决后记录下来. 环境:LinuxMint 18.3 安装redis sudo wget http://download.redis.io/relea ...

  10. Netty(RPC高性能之道)原理剖析

    转载:http://blog.csdn.net/zhiguozhu/article/details/50517551 1,Netty简述 Netty 是一个基于 JAVA NIO 类库的异步通信框架, ...