//非递归快速幂 intqpow(int a, int n){ int ans = 1; while(n){ if(n&1) //如果n的当前末位为1 ans *= a; //ans乘上当前的a a *= a; //a自乘 n >>= 1; //n往右移一位 } return ans; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
//泛型的非递归快速幂 template <typename T> T qpow(T a, ll n) { T ans = 1; // 赋值为乘法单位元,可能要根据构造函数修改 while (n) { if (n & 1) ans = ans * a; // 这里就最好别用自乘了,不然重载完*还要重载*=,有点麻烦。 n >>= 1; a = a * a; } return ans; }
1 2 3 4 5 6 7 8 9 10 11 12 13
//求 m^k mod p,时间复杂度 O(logk)。
intqmi(int m, int k, int p) { int res = 1 % p, t = m; while (k) { if (k&1) res = res * t % p; t = t * t % p; k >>= 1; } return res; }