快速幂
题目链接:https://www.luogu.org/problemnew/show/P1226
快速幂用了二分的思想,即将\(a^{b}\)的指数b不断分解成二进制的形式,然后相乘累加起来,就是用\(a^{b/2}×a^{b/2}\)去求\(a{^b}\)。
例如:\(a^{11}=a^{(2^0+2^1+2^3)}\)
程序实现是这样的(使用了位运算):
ll pow(ll b,ll p,ll k)
{for(;p;p>>=1) // >> 右移等同于 /2{if(p&1) //判断p是否为奇数,是则返回trueans=ans*b%k;b=b*b%k;}return ans%k;
}
AC代码
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int k=1,m=0,flag;
ll ans=1;
ll pow(ll b,ll p,ll k)
{for(;p;p>>=1){if(p&1)ans=ans*b%k;b=b*b%k;}return ans%k;
}
int main()
{ll b,p,k;cin>>b>>p>>k;ll m=pow(b,p,k)%k;printf("%d^%d mod %d=%d",b,p,k,m); return 0;
}
矩阵快速幂
题目链接:https://www.luogu.org/problemnew/show/P3390
矩阵运算法则
矩阵A的大小为\(n×m\),B的大小为\(n×k\),设\(C=A×B\)
则\(C_{i,j}=\sum\limits_{k=1}^{n}A_{i,p}×B_{p,j}\)
例:
矩阵乘满足结合律:\((AB)C=A(BC)\)
有一种特殊的矩阵:单位矩阵,它从左上角到右下角的对角线上的元素均为1,除此以外全都为0。它在矩阵乘中相当于数乘中的1,即任何矩阵乘它都等于本身。
以上这些就是打出矩阵快速幂前必备的基础知识了。
代码实现
- 理解了矩阵乘法之后,我们就可以用函数来模拟矩阵乘了。
Mat Mul(Mat x,Mat y)
{for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c.m[i][j]=0;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]%mod+x.m[i][k]*y.m[k][j]%mod;}return c;
}
- 因为矩阵乘满足结合律,所以快速幂完全适用于矩阵,矩阵快速幂和普通快速幂几乎一模一样,不同点在于“*”号改成了Mul函数(不会普通快速幂的请前往P1226)
Mat pow(Mat x,ll y)
{Mat ans=e;while(y){if(y&1)ans=Mul(ans,x); x=Mul(x,x);y>>=1;}return ans;
}
知道了这些后,这道题基本就可以AC了
最后要注意开long long,不然会爆零。
AC代码:
#include<iostream>
#include<cstring>
#define mod 1000000007
#define ll long long
using namespace std;
struct Mat{ll m[101][101];
};//结构体存矩阵
Mat a,e;//a是输入的矩阵,e是单位矩阵
ll n,p;
Mat Mul(Mat x,Mat y) //矩阵乘
{Mat c;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c.m[i][j]=0;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]%mod+x.m[i][k]*y.m[k][j]%mod;}return c;
}
Mat pow(Mat x,ll y) //矩阵快速幂
{Mat ans=e;while(y){if(y&1)ans=Mul(ans,x); x=Mul(x,x);y>>=1;}return ans;
}int main()
{//输入 cin>>n>>p;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>a.m[i][j];//算法核心 for(int i=1;i<=n;i++)e.m[i][i]=1; Mat ans=pow(a,p);//输出 for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)cout<<ans.m[i][j]%mod<<" ";cout<<endl;} return 0;
}
广告时间
在下的洛谷博客&&博客园博客