zoukankan      html  css  js  c++  java
  • noip复习——快速幂

    (a ^ n mod p)


    (a, p, n leq 10^9)

    最普通的二进制拆分

    #define LL long long
    LL qpow(LL a, LL n, LL p)
    {
        LL ans = 1;
        for (; n; n >>= 1, a = a * a % p)
            if (n & 1)
                ans = ans * a % p;
        return ans % p;
    }
    

    (a, p, n leq 10^{14})

    底数变大了,直接做(a * a)会爆longlong,需要用类似快速幂的方法做乘法

    #define LL long long
    LL mul(LL a, LL n, LL p)
    {
        LL ans = 0;
        for (; n; n >>= 1, a = (a << 1) % p)
            if (n & 1)
                ans = (ans + a) % p;
        return ans % p;
    }
    LL qpow(LL a, LL n, LL p)
    {
        LL ans = 1;
        for (; n; n >>= 1, a = mul(a, a, p))
            if (n & 1)
                ans = mul(ans, a, p) % p;
        return ans % p;
    }
    

    (a, p leq 10^{14}, n leq 10 ^ {100}) ((a perp p))

    初看数据范围,出题人在搞事情。其实只是用了一个欧拉定理的结论:

    [a^n equiv a^{n mod varphi(p)} pmod p (a perp p) ]

    (O(sqrt{p}))(varphi(p)),n先读字符串然后按快读的方式处理即可。


    (a, p leq 10^{14}, n leq 10 ^ {100})

    (a, p)互质的条件去掉了怎么办?当(n leq varphi(p))时可以直接算,否则用到以下结论:

    [a^n equiv a^{n mod varphi(p) + varphi(p)} pmod p ]

  • 相关阅读:
    提取BioGRID中的基因symbol和得分所在列
    windows端同步数据到samba共享
    C++的基本语法
    上传文件到服务器功能
    django数据库的使用
    django文件的下载实现
    获取文本域输入的内容
    js的if判断
    ajax的使用
    Oracle ADG备库新增变为一主多从
  • 原文地址:https://www.cnblogs.com/happyLittleRabbit/p/10812279.html
Copyright © 2011-2022 走看看