快速幂问题解答

快速幂模板:

typedef long long ll;
ll const mod=1000000007;
ll exp_mod(ll x,ll y)//求x^y对mod取模 
{
	ll ans=1;
	while(y)
	{
		if(y&1)
		    ans=(ans*x)%mod;
		x=(x*x)%mod;
		b>>=1;
	}
	return ans;
}

其中要好好理解用y来寻找循环次数,其次就是为什么其中出现了在if(y&1)的条件之下必须进行ans*=x;

说完了简单的快速幂的基本模式以后,再来看看在矩阵中的快速幂运算:
首先定义矩阵结构体:

struct  Mat(int x,int y)
{
    int m[101][101];
}

结构体能比较方便地储存以及可以很好地作为函数的参数进行传递;

其次矩阵当中的乘法法则和数字中的乘法法则不太一样:
矩阵乘法
从而定义矩阵的乘法代码为:

Mat Mut(Mat x,Mat y)
{
	Mat c;
	for(int i=1;i<=n;i++)
	    for(int j=1;i<=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]+x.[i][k]*y.[k][j];
			 } 
	return c;
}

从而在按照原来的快速幂的模板码出矩阵快速幂模板
但是必须先定义一个幺元,就比如在数字计算中的幺元就是1。

Mat e;
for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
        e.m[i][j]=1;

矩阵快速幂模板:

Mat pow(Mat x,ll y)
{
	Mat ans=e;
	while(y)
	{
		if(y&1)
		    ans=Mut(ans,x);
		x=Mul(x,x);
		y>>1;
	}
	return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值