看到群里有人出了一道ACM题,要求计算(a^0 + a^1 + a^2 + ... + a^n) % m的值
其中三个数的取值范围为 0 <= a <= 10^16, 0 <= n <= 10^9, 1 <= m <= 10^9
看到这样一道题,首先联想到计算(a^b)%m,后者可以通过分解幂来计算
那前者能不能通过同样的方法来计算呢
看下面这个分解过程:
另
FX( a, n, m ) 为公式一
FXMultiplication( a, h, m ) 为公式二,其中FXMultiplication即要返回公式的值,又要返回 a^(2h)的值,方便继续计算
实现代码如下:
其实上面的代码中时间复杂度还有可优化的地方,您看出来了吗?