//客流量上限,洛谷
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));
}
}