快速幂与矩阵快速幂(板子)

【快速幂】

快速幂用于高效求(a^b) mod n 的结果。考虑到分治思想,当b为偶数时,我们可以把a^b转化为a^(b/2)*a^(b/2),当b为奇数时,我们可以把a^b转化为a^(b/2)*a^(b/2)*a。不断分解,最终b会变成1,并且只需要logb次就可以把b变成1。

【代码实现】

int quick_pow(int a,int b,int n) //递归
{
    if(b==1) return a;
    int t=quick_pow(a,b/2,n);
    t=t*t%n;
    if(b%2)
       t=t*a%n;
    return t;
}

int quick_pow(int a,int b,int n)  //非递归
{
    int ret=1;
    while(b)
    {
        if(b%2) ret=ret*a%n;
        a=a*a%n;
        b=b/2;
    }
    return ret;
}

【矩阵快速幂】

矩阵乘法:

const int N=100;
int c[N][N];
void multi(int a[][N],int b[][N],int n)  //n是矩阵大小
{
    memset(c,0,sizeof(c));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
               c[i][j]+=a[i][k]*b[k][j];
}

【代码实现】 

const int N=100;
int tmp[N][N];
void multi(int a[][N],int b[][N],int n)
{
    int i,j,k;
    memset(tmp,0,sizeof tmp);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            for(k=0;k<n;k++)
                tmp[i][j]+=a[i][k]*b[k][j];
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
           a[i][j]=tmp[i][j];
}
int res[N][N];
void Pow(int a[][N],int n)
{
    memset(res,0,sizeof res);  //n是幂,N是矩阵大小
    for(int i=0;i<N;i++) 
       res[i][i]=1;
    while(n)
    {
        if(n&1)
            multi(res,a,N);  //res=res*a;
        multi(a,a,N);  //a=a*a
        n>>=1;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41117236/article/details/81093655