运用O(1)快速乘的快速幂写法以及注意事项

文章讨论了如何使用快速幂算法解决大整数幂运算,并提出了进一步的优化策略,即通过快速乘方法提升计算速度。在原基础上,当执行`res*a%mod`时,改用O(1)的快速乘公式`(a*b-((ll)((longdouble)a/mod*b))*mod+mod)%mod`,同时强调了在计算前对a和b取模的重要性。最后展示了优化后的快速幂算法实现。
摘要由CSDN通过智能技术生成

题目,给定较大的a,b,c  求a^b%c

首先看到题目是用基础的快速幂算法,其模板如下:

inline ll ksm(ll a,ll b,ll mod)
{
    if (mod==1)return 0;
    ll res=1;
    while(b)
    {
        if(b&1)
            res=res*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return res;
}

这就已经很快了吗?还可以继续优化!

比如看到res*a%mod

可以使用O(1)快速乘来继续优化速度,其模板如下

ll mul(ll a,ll b,ll mod)
{
    a %= mod;
    b %= mod;
    return (a*b-((ll)((long double)a/mod*b))*mod+mod)%mod;
}

注意事项:

1.  a,b 使用前先取模,不然可能会被卡样例

2. long double需要将a先转成 long double 型  随后对其代数式整体转LL

原始的快速乘

inline ll ksc(ll a, ll b, ll c)
{
    ll ans = 0;
    while(b)
    {
        if(b & 1)ans = (ans + a) % c;
        b >>= 1;
        a = (a + a) % c;
    }
    return ans;
}

结合以上代码,我们写出优化后的快速幂

ll mul(ll a,ll b,ll mod)
{
    a %= mod;
    b %= mod;
    return (a*b-((ll)((long double)a/mod*b))*mod+mod)%mod;
}

inline ll ksm(ll a,ll b,ll mod)
{
    if (mod==1)return 0;
    ll res=1;
    while(b)
    {
        if(b&1)
            res=mul(res,a,mod);
        b>>=1;
        a=mul(a,a,mod);
    }
    return res;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSU_曾是此间年少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值