快速幂
题目
思路
由数据规模,如果暴力惩罚的花,那就是2的31(a的b次方),肯定不行
假如是求a的1101(二进制)次方,(以下数都表示二进制)那么可以拆解为a的1次方乘以a的00次方乘以a的100次方乘以a的1000次方
代码
这种算法将复杂度降低约为logb
int main()
{
long long a,b,k,ans=1;
//数据那么大,记得开longlong
cin>>a>>b>>k;
if(b==0)
{
cout<<1%k;
return 0;
}
while(b!=0)
{
if(b&1!=0)
ans=ans*a%k;
a=a*a%k;
b=b>>1;
}
cout<<ans;
}
矩阵快速幂
适用于通项比较难求的情况
(适用于方阵)
斐波那契数列
将斐波那契数列表示为矩阵乘法
下边的i、i-1、2、1都表示斐波那契的第n项
快速求出斐波那契的第n项
这就表示成了幂的形式,再按照上边的思路就可以了
struct Matrix
{
int m[maxn][maxn];
};
Matrix multi(Matrix a,matrix b,int n)
{
Matrix tmp;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
tmp.m[i][j]+=A.m[i][k]*B.m[k][j]
}
}
}
return tmp;
}
void quikpower(int N,int n)
{
for(int i=1;i<=n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)ans.m[i][j]=1;
else ans.m[i][j]=0;
}
}
while(N)
{
if(N&1)
{
ans=Mul(ans,a);
}
a=Mul(a,a);
N=>>1;
}
}