数论-快速幂

没看懂,先记着
https://www.cnblogs.com/sun-of-Ice/p/9330352.html(转)

快速幂

typedef long long ll;
ll mod;
ll qpow(ll a, ll n)//计算a^n % mod
{
    ll re = 1;
    while(n)
    {
        if(n & 1)//判断n的最后一位是否为1
            re = (re * a) % mod;
        n >>= 1;//舍去n的最后一位
        a = (a * a) % mod;//将a平方
    }
    return re % mod;
}

矩阵快速幂

struct matrix//定义一个结构体,方便传递值
{
    int m[maxn][maxn];
};

/*
maxn和mod由全局定义,其中mod根据需要可以省去
*/

matrix mat_multi(matrix a, matrix b)//矩阵求积
{
    matrix ans;
    for(int i = 0;i < maxn;i++)
    {
        for(int j = 0;j < maxn;j++)
        {
            ans.m[i][j] = 0;
            for(int k = 0;k < maxn;k++)
            {
                ans.m[i][j] += (a.m[i][k] % mod * b.m[k][j] % mod) % mod;
                ans.m[i][j] %= mod;
            }
        }
    }
    return ans;
}

matrix mat_quickpow(matrix a, int n)//矩阵快速幂
{
    matrix ans;
    for(int i = 0;i < maxn;i++)
    {
        for(int j = 0;j < maxn;j++)
        {
            if(i == j)
                ans.m[i][j] = 1;
            else
                ans.m[i][j] = 0;//这里要初始化为单位矩阵,类比普通快速幂这里初始化为1
        }
    }
    while(n != 0)//方法与普通快速幂相同,只有乘法的实现不同
    {
        if(n & 1)
            ans = mat_multi(a, ans);
        a = mat_multi(a, a);
        n >>= 1;
    }
    return ans;
}

你可能感兴趣的:(数论)