[每日一题2020.06.15]P1226 模板快速幂取余运算

Posted roccoshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[每日一题2020.06.15]P1226 模板快速幂取余运算相关的知识,希望对你有一定的参考价值。

我是题目

快速幂就是快速求 (a^b)的一种算法

快速幂

思想 :

比如我要求 (6^9)

首先将幂转化为二进制形式 :

[6^9 = 6^{1001} ag{1} ]

可以得到 :

[6^9 = 6^{2^{3}} imes 6^{2^0} ag{2} ]

由于一个数变成二进制位数为(log _2oldsymbol{b}) 位, 故相对于直接求幂 ( b位需要b次计算 ), 时间复杂度减小了

取余

两条基本性质 :

[left( oldsymbol{X}+oldsymbol{Y} ight) ,,\\% oldsymbol{a},,=,,left( oldsymbol{X}\\%oldsymbol{a}+oldsymbol{Y}\\%oldsymbol{a} ight) \\%oldsymbol{a} ag{1} ]

[left( oldsymbol{X} imes oldsymbol{Y} ight) ,,\\% oldsymbol{a},,=,,left( left( oldsymbol{X}\\%oldsymbol{a} ight) imes left( oldsymbol{Y}\\%oldsymbol{a} ight) ight) \\%oldsymbol{a} ag{2} ]

上代码

ll qpow(ll x, ll y, ll mod)  { 
	ll ans = 1;
	ll base = x;
	while(y > 0) {
		if(y & 1){
			ans *= base;
			ans %= mod;
		}
		base *= base;
		base %= mod;
		y>>=1;
	}
	return ans % mod;
}

不取余的版本

ll qpow(ll x, ll y)  { 
	ll ans = 1;
	ll base = x;
	while(y > 0) {
		if(y & 1){
			ans *= base;
		}
		base *= base;
		y>>=1;
	}
	return ans;
}

与pow的时间比较

对比一下时间 :

快速幂 : 0.796s

技术图片

普通求幂 :2.092s

技术图片

以上是关于[每日一题2020.06.15]P1226 模板快速幂取余运算的主要内容,如果未能解决你的问题,请参考以下文章

每日一题快速排序

[每日一题2020.06.12]P3375 模板KMP字符串匹配

每日一题648. 单词替换

(每日一题)2016 北京ICPC网络赛G hihocoder 1388 (中国剩余定理 + NTT)

2020 ICPC Macau A. Accelerator(期望,计数,分治FFT)(每日一题 21.7.6)

2020 ICPC Macau A. Accelerator(期望,计数,分治FFT)(每日一题 21.7.6)