快速幂
实数快速幂
普通求幂的方法为 O(n) 。在一些要求比较严格的题目上很有可能会超时。所以下面来介绍一下快速幂。
快速幂的思想其实是将数分解,即ab可以分解为(a2)*(a2)...a;然后再分别算a2;这样的计算量由O(n)一下变成 \(O(logn)\);
模板代码如下:
ll pow(int a,int b)
{
if(b==0) return 1;
ll res=1 % mod;
while(b)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
当然,如果题目没要求取模操作的话,可以将%mod删掉即可。
矩阵快速幂
矩阵快速幂其实就是将矩阵乘法和快速幂结合起来, 再用一下单位矩阵的性质即可。复杂度\(O(log{k} * n*m )\),下面是实现代码:
LL n, k;
struct node{
LL arr[maxn][maxn];
}a;
node mul(node a, node b)
{
node ans;
memset(ans.arr, 0, sizeof(ans.arr));
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= n; ++j){
for(int k = 1; k <= n; ++k){
ans.arr[i][j] = (ans.arr[i][j] + a.arr[i][k] * b.arr[k][j]) % mod;
}
}
}
return ans;
}
node operator ^(node a, LL k)
{
node ans;
memset(ans.arr, 0, sizeof(ans.arr));
for(int i = 1; i <= n; ++i) ans.arr[i][i] = 1;
while(k){
if(k & 1) ans = mul(ans, a);
a = mul(a, a);
k >>= 1;
}
return ans;
}
node ans = a ^ k;
输出ans即可...
原文链接: https://www.cnblogs.com/StungYep/p/12252391.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/326699
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!