2023/7/24

文章介绍了欧几里得算法用于求两整数最大公倍数的原理及其实现,扩展欧几里得算法在求解线性同余方程中的应用,以及快速幂和矩阵快速幂这两种优化高次幂运算的方法。还提到了单调栈和单调队列在处理数列和区间最值问题上的作用。
摘要由CSDN通过智能技术生成

欧几里得算法

用于求两整数的最大公倍数,其原理为gcd(a,b)\equiv gcd(b,a\%b),由于后者的a%b总是不断减小的,直至为0,所以当a%b=0时,gcd(a,b)=gcd(c,0),此时a和b的最大公约数就是c,其复杂度在O(log max(a,b))以内。

int gcd(int a,int b){
    if(b==0)return a;
return gcd (b,a%b);
}//递归写法

int gcd(int a,int b){
    while(1){ 
        int r=a % b;
        a=b;
        b=r;
        if(b == 0) return a;//循环写法
    }
}

扩展欧几里得算法

一个双六上有前后无限延续的格子,每个格子写有整数(可以想象为数列)。其中0号格子是起点,1号格子是终点,我们只能选则一个方向走a步或b步(a,b均为整数),所以根据a和b的值不同,我们有可能永远无法到达终点。

求一组可能的解,如果无解,输出-1

利用数学语言翻译,题意即求整数x和y使得ax+by=1。由欧几里得算法可以知道,当gcd(a,b)\neq 1时,显然无解。反之,如果gcd(a,b)=1,那么就可以扩展欧几里得算法来求解

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

快速幂

防止高次幂爆内存,优化幂运算,都应使用快速幂。

将幂级数转换为2进制数,通过将线性的幂级数变成平方数来快速的到幂的结果。

typedef long long ll;
ll mod_pow(ll x,ll n,ll mod){
    ll res=1;
    while(n>0){
        if(n&1)res=res*x%mod;
        x=x*x%mod;
        n>>=1;
    }
    return res;
}

矩阵快速幂

有时候我们需要矩阵快速幂来加快运算,比如在计算斐波那契数列的时候,就可以通过矩阵的形式表达斐波那契数列,再用快速幂来加速运算,原理相同,只是将数改为矩阵,同时需要定义矩阵乘法。

定义矩阵及其乘法(取模与否按需处理)

typedef long long ll;
struct matrix{
    ll m[N][N];
}
matrix operator * (const matrix a, const matrix b){
    matrix res;
    memset(res.m , 0 , sizeof(res.m));
    for(int i = 0;i < N; i++ ){
        for(int j = 0;j < N; j++ ){
            for(int k = 0;k < N; K++ ){
                res.m[i][j] = (res.m[i][j] + a.m[i][k] * b.m[k][j] % mod) % mod;
            }
        }
    }
    return res;
}

快速幂

matrix pow_matrix( matrix a , ll n ){
    matrix ans;
    memset(ans.m , 0 , sizeof(ans.m));
    for(int i = 0;i < N; i++ )ans.m[i][i] = 1;
    while(n > 0){
        if(n & 1) ans = ans * a;
        a = a * a;
        n >>= 1;
    }
    return ans;
}

单调栈和单调队列

单调栈模板题洛谷

单调栈模板题Acwing

单调队列模板题Acwing

取出数列中/区间中条件最大值/最小值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值