快速幂 & 慢速乘

快速幂

快速求幂,防止爆炸
----- 将n转化为二进制

  • a^n % p
ll poww(ll a, ll n, ll p) {
    ll ans = 1;
    while (n) {
        if (n & 1) ans = ans * a % p;//若不取模就去掉p
        a = a * a % p;
        n >>= 1;
    }
    return ans;
}

慢速乘

  • 对很大的数取模时,这时计算机的long long进行乘法就会爆掉
  • 将a 或 b 转化为二进制
  • a*b % p
ll mul(ll a, ll b, ll p) {
    ll ans = 0;
    while (b) {
        if (b & 1) ans += a, ans %= p;
        a *= 2, a %= p;
        b >>= 1;
    }
    return ans;
}

发布了22 篇原创文章 · 获赞 0 · 访问量 547

猜你喜欢

转载自blog.csdn.net/skyyemperor/article/details/104727889