//客流量上限,洛谷
public class Main {
    static final int MOD = (int) 1e9 + 7;
    public static int qmi(int m, int k, int p) {
        //m的k次方,对p取模
        long t = m, res = 1;
        while (k > 0) {
            //下面此判断,是进行二进制与操作,109 转化为2进制是1011011 与 100000进行与运算得1
            //后面109右移,变成54,011011 与100000与运算,得0
            //然后54右移得27,11011与10000与运算,得1
            //27右移得13 二进制为1011与1000与运算得1
            //13右移得6 二进制为011与100与运算得0
            //6右移得3 二进制为11与10与运算得1
            //3右移得1二进制为1与1与运算得1
            //1右移得0 与1与运算得0
            if ((k & 1) == 1) {
                //上面则是过程,如果k变成二进制的这一位是1,就说明进行乘方,但是为了防止数太大进行取余
                res = res * t % p;
            }
            //下面这一步是整个快速幂的核心内容,k每进行一次右移,只要不为0,t就会乘自己一次(t->t2,t2->t4这种)
            //若K为109,1011011,一共进行了7次为运算,那么,t就经历了
            //t->      1   true
            //t2
            //t4        1   true
            //t8        1   true
            //t16
            //t32        1   true
            //t64        1   true
            //t128 
            //所以res=t1*t4*t8*t32*t64
            t = t * t % p;
            //右移运算,取整
            k >>= 1;
        }
        return (int) res;
    }

    public static int power(int m, int k, int p) {
        int res = 1;
        while (k-- > 0) {
            res = res * m % p;
        }
        return res;
    }

    public static void main(String[] args) {
        System.out.println(qmi(2, 1012, MOD));
        System.out.println(power(2, 1012, MOD));
    }
}

 

posted on 2025-05-04 17:34  fafrkvit  阅读(6)  评论(0)    收藏  举报