typedeflonglong LL; //计算(a^b)%mod; LL pow1(LL a, int b, int mod)//递归写法 { if (b == 0)return1; LL t = pow1(a, b / 2, mod) % mod; //先求a ^ (b/2) if (b & 1)return t * t% mod * a% mod; //如果为奇数,需要额外乘上a elsereturn t * t% mod; }
3.迭代写法
1 2 3 4 5 6 7 8 9 10 11 12
//计算(a^b)%mod; LL pow2(LL a, int b, int mod)//迭代写法 { LL ans = 1; while (b) { if (b & 1) //判断b的奇偶性 ans = ans * a % mod; //如果为奇数,需要额外乘上a a = a * a % mod; b >>= 1; //除以2 } return ans; }
//把数的相乘转换为矩阵相乘 Mat Mul(Mat a, Mat b, int n){//计算矩阵a乘矩阵b,n为矩阵的大小 Mat c;//临时矩阵c memset(c.m, 0, sizeof(c.m)); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) for (int k = 1; k <= n; k++) c.m[i][j] = (c.m[i][j] + (a.m[i][k] * b.m[k][j]) % mod) % mod; return c; } //本质的快速幂思想是一样的 Mat power(Mat a, int b, int n){//计算a^b,n为矩阵的大小 for (int i = 1; i <= n; i++)//构造单位矩阵 ans.m[i][i] = 1; while (b) { if (b & 1) ans = Mul(ans, a, n); a = Mul(a, a, n); b >>= 1; } return ans; }