矩阵快速幂与快速幂模板 整理


快速幂和矩阵快速幂, 都是优化,  使时间复杂度在 log(N) 内,  对于 超大数 运算 极为有效

矩阵快速幂与快速幂 其核心思想一样,   只不过用矩阵表达;

模板如下:


快速幂:

typedef long long LL;
LL fun(LL x,LL n,)
{
    LL res=1;
    while(n>0)
    {
        if(n & 1)
            res=(res*x)%Max;
        x=(x*x)%Max;
        n >>= 1;
    }
    return res;
}

矩阵快速幂:

struct Matrix{
	ll arr[N][N];
	void init()
	{
		memset(arr,0,sizeof(arr));
		for(int i=0;i<MAXN;i++)
			a[i][i]=1;//初始化
	}
}A;
Matrix mul(Matrix X,Matrix Y)// 矩阵乘法
{
	Matrix ans;
	for(int i=0;i<MAXN;i++)
		for(int j=0;j<MAXN;j++){
			ans.arr[i][j]=0;
			for(int k=0;k<MAXN;k++)
				ans.arr[i][j]+=X.arr[i][k]*Y.arr[k][j];
			ans.arr[i][j]%=MOD;
		}
	return ans;
}
Matrix Q_pow(Matrix B,int n)// ¾ØÕó¿ìËÙÃÝ 
{
	Matrix ans;
	ans.init();
	while(n)
	{
		if(n&1)
			ans=mul(ans,B);
		n>>=1;
		B=mul(B,B);
	}
	return ans;
}
Matrix Add(Matrix a,Matrix b)  //(a+b)%mod 矩阵加法
{  
    int i,j,k;  
    Matrix ans;  
    for(i=0;i<MAXN;i++)  
        for(j=0;j<MAXN;j++)  
        {  
            ans.arr[i][j]=a.arr[i][j]+b.arr[i][j];  
            ans.arr[i][j]%=MOD;  
        }  
    return ans;  
}  
Matrix Sum(Matrix a,int n)// 矩阵和
{
	int m;
	Matrix ans,pre;
	if(n==1) return ans;
	m=n/2;
	pre=Sum(a,m);
	ans=Add(pre,mul(pre,Q_pow(a,m)));
	if(n&1)
		ans=Add(ans,Q_pow(a,n));
	return ans;
}


posted @ 2017-08-09 16:51  Sizaif  阅读(212)  评论(0编辑  收藏  举报