倍增原理 快速加 龟速乘 右移 位运算 与运算 数据范围 AcWing 90. 64位整数乘法

#include

using namespace std;

typedef long long LL;

LL qadd(LL a,LL b,LL p)
{
    LL res=0;
    while(b)
    {
        if(b&1)
            res=(res+a)%p;
        b>>=1;
        a=(a+a)%p;
    }
    
    return res;
}

int main()
{
    LL a,b,p;
    cin>>a>>b>>p;
    cout<<qadd(a,b,p)<<endl;
    
    return 0;
}

龟速乘

快速加

和快速幂的代码几乎一模一样

快速幂是把乘方转换成乘法

龟速乘是把乘法转换成加法

都是使用倍增的原理

这里是先计算a,然后计算,2a,4a,8a,16a,32a,...

快速幂计算因为是乘法,所以答案的初始值定义为1,这里是加法,所以答案的初始值定义为0

算术右移,与运算和快速幂算法一模一样,两个long long的数字相加不会超出数据范围,两个int的数相乘不会超过long long但是两个long long的数字相乘就会超过数据范围了

你可能感兴趣的:(#,acwing算法提高,c++,算法,开发语言)