module c++

1.gcd

int gcd(int a,int b){
return b?gcd(b,a%b):a;
}123

2.扩展gcd )extend great common divisor

ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){x=1;y=0;return a;}
else
{
ll d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
}12345678910

3.求a关于m的乘法逆元

ll mod_inverse(ll a,ll m){
ll x,y;
if(exgcd(a,m,x,y)==1)//ax+my=1
return (x%m+m)%m;
return -1;//不存在
}123456

补充:求逆元还可以用

4.快速幂quick power

ll qpow(ll a,ll b,ll m){
ll ans=1;
ll k=a;
while(b){
if(b&1)ans=ansk%m;
k=k
k%m;
b>>=1;
}
return ans;
}12345678910

5.快速乘,直接乘会爆ll时需要它,也叫二分乘法。

ll qmul(ll a,ll b,ll m){
ll ans=0;
ll k=a;
ll f=1;//f是用来存负号的
if(k<0){f=-1;k=-k;}
if(b<0){f*=-1;b=-b;}
while(b){
if(b&1)
ans=(ans+k)%m;
k=(k+k)%m;
b>>=1;
}
return ans*f;
}1234567891011121314

6.中国剩余定理CRT (x=ai mod mi)

ll china(ll n, ll *a,ll m) {
ll M=1,y,x=0,d;
for(ll i = 1; i <= n; i++) M = m[i];
for(ll i = 1; i <= n; i++) {
ll w = M /m[i];
exgcd(m[i], w, d, y);//m[i]d+wy=1
x = (x + y
w
a[i]) % M;
}
return (x+M)%M;
}12345678910

7.筛素数,全局:int cnt,prime[N],p[N];

void isprime()
{
cnt = 0;
memset(prime,true,sizeof(prime));
for(int i=2; i<N; i++)
{
if(prime[i])
{
p[cnt++] = i;
for(int j=i+i; j<N; j+=i)
prime[j] = false;
}
}
}1234567891011121314

8.快速计算逆元

证明:转送门

void inverse(){
inv[1] = 1;
for(int i=2;i<N;i++)
{
if(i >= M) break;
inv[i] = (M-M/i)*inv[M%i]%M;
}
}12345678

9.组合数取模

n和m 10^5时,预处理出逆元和阶乘

ll fac[N]={1,1},inv[N]={1,1},f[N]={1,1};
ll C(ll a,ll b){
if(b>a)return 0;
return fac[a]inv[b]%Minv[a-b]%M;
}
void init(){//快速计算阶乘的逆元
for(int i=2;i<N;i++){
fac[i]=fac[i-1]*i%M;
f[i]=(M-M/i)*f[M%i]%M;
inv[i]=inv[i-1]*f[i]%M;
}
}123456789101112

n较大109,但是m较小105时

ll C(ll n,ll m){
if(m>n)return 0;
ll ans=1;
for(int i=1;i<=m;i++)
ans=ans*(n-i+1)%M*qpow(i,M-2,M)%M;
return ans;
}1234567

n和m特别大1018时但是p较小105时用lucas

10.Lucas大组合取模

#define N 100005
#define M 100007
ll n,m,fac[N]={1};
ll C(ll n,ll m){
if(m>n)return 0;
return fac[n]qpow(fac[m],M-2,M)%Mqpow(fac[n-m],M-2,M)%M;//费马小定理求逆元
}
ll lucas(ll n,ll m){
if(!m)return 1;
return(C(n%M,m%M)*lucas(n/M,m/M))%M;
}
void init(){
for(int i=1;i<=M;i++)
fac[i]=fac[i-1]*i%M;
}


本文来自 bbbblzy 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/bbbblzy/article/details/78106776?utm_source=copy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值