作业介绍
倍增法(英语:binary lifting),顾名思义就是翻倍。倍增法和二分法是“相反”的算法。二分法每次缩小为上一次的1/2,倍增法每次扩大一倍,两者都以2的质数减少或增加,它能够使线性的处理转化为对数级的处理,大大地优化时间复杂度。
“倍增”与“二进制划分”两个思想相互结合,降低了求解很多问题的时间与空间复杂度。快速幂其实就是“倍增”与“二进制划分”思想的一种体现。
数学知识储备:
一般地,在数学上,n个相同的因数a相乘的积记做 。这种求几个相同因数的积的运算叫做乘方,乘方的结果叫做幂。在中,a叫做底数,n叫做指数。读作“a的n次方”或“a的n次幂“。
指数幂的性质:
- 同底数幂相乘,底数不变,指数相加。即 (m,n都是有理数)。
- 幂的乘方,底数不变,指数相乘。即 (m,n都是有理数)。
数的二进制表示(二进制划分):
例如35,它的二进制是100011,第5、1、0位是1,即,把这几位的权值相加,有。
数的二进制划分反映了一种快速增长的特性,第i位的权值等于前面所有权值的和加1:
一个整数n,它的二进制表示只有位。如果要从0增长到n,可以用1、2、4、…、2k为“跳板”,快速跳到n,这些跳板只有个。
倍增法的特点是需要提前计算出第1、2、4、…、2k个跳板,这要求数据是静态不变的,不是动态变化的。如果数据发生了变化,所有跳板要重新计算,跳板就失去了意义。
快速幂模板
求 m^k mod p,时间复杂度 O(logk)。
int qmi(int m, int k, int p)
{
int res = 1 % p, t = m;
while (k)
{
if (k&1) res = res * t % p;
t = t * t % p;
k >>= 1;
}
return res;
}
题目
认领作业后才可以查看作业内容。
- 状态
- 正在进行…
- 题目
- 9
- 开始时间
- 2025-1-9 0:00
- 截止时间
- 3333-5-1 23:59
- 可延期
- 24 小时