快速幂
简介
快速幂是能快速计算一个幂的方案,他可以作用于所有满足结合律、封闭性的二元运算,即半群
定义
不妨假设这个二元运算为
快速幂核心思想
在半群中,只要
所以我们可以把k看作一个二进制数,把
这里最多分解为
代码
1 | T qpow(T a,int k){ |
加法模群快速幂
在加法模群中,getE()定义为0,因为任何数加上0得到自身。binaryOp为二元运算
乘法模群快速幂
在乘法模群中,getE()定义为1,因为任何数乘以1得到自身。binaryOp为二元运算
矩阵乘法模群快速幂
在矩阵乘法模群中,getE()定义为矩阵的单位元,即对角线全为1的对角矩阵。binaryOp为普通矩阵模乘。
无理数乘法快速幂
很多时候我们需要用到无理数,即设一个无理数
这时候单位元是getE()=binaryOp为普通无理数乘法。
置换群快速幂
在置换中,单位元为binaryOp为普通置换乘法。
十进制快速幂
有的时候,给你的k是一个10进制大数,由于我们朴素的快速幂需要使用二进制的k(后面有移位),所以会遇到一些麻烦。
当然,最简单的就是直接分解为十进制乘法。
道理都是一样的。这里最多分解出
代码
矩阵快速幂
1 | typedef long long ll; |
十进制快速幂
1 | #include<bits/stdc++.h> |