快速幂/分数取模简介

快速幂

快速幂所要做的,就是求出 \(a^b\mod p\) 的值。由于 \(b\) 往往很大,以至于超过 \(10^7\) ,使得普通的 \(O(n)\) 求幂算法可行度不高,因此要用到快速幂。
快速幂的原理也很简单,就是将 b 逐渐化小,从而做到以 \(O(log_2(n))\) 的复杂度完成:

对于式子 \(a^{2b+1}\mod p\),可以转化为 \({(a^2) \mod p}^b \times b\mod p\)
而对于 \(a^{2b}\mod p\),则转化为 \({(a^2)}^b\mod p\)

经过若干次转化使得 \(b=0\),此时就得到了答案。

Code:

#define int long long
const int mod=192600817 
int qsm(int x,int y)
{
    int res=1;
    while(y)
    {
        if(x&1)
            res=(res*x)%mod;
        x=(x*x)%mod;
        y>>=1;
    }
    return res;
}

分数取模

此处的分数取模,所求的是 \(a/b \mod p\) 的值,因为与余数相关的除法不像加减乘这样可以直接计算,所以需要用到其他方法。

我们可以将这个十字转化为 \(a\times b^{-1} \mod p\),又根据费马小定理,可以转换为 \(a\times b^{(p-2)} \mod p\),这就可以用快速幂解决了。

Code:

#define int long long
const int mod=192600817 
int qsm(int x,int y)
{
    int res=1;
    while(y)
    {
        if(x&1)
            res=(res*x)%mod;
        x=(x*x)%mod;
        y>>=1;
    }
    return res;
}
int MOD(int x,int y)
{
    return x%mod*qsm(y,mod-2)%mod;
}
posted on 2020-09-29 09:56  Orzlky  阅读(255)  评论(0编辑  收藏  举报