剑指 Offer 14- II. 剪绳子 II - 力扣(LeetCode) (leetcode-cn.com)
本题只是在 "剪绳子 I" 的基础上增大了数据,因此我们只需要另外处理大数求余问题即可。
剪绳子I的题解:
剑指offer 14 - I. 剪绳子(贪心,DP)_Corux的博客-CSDN博客
目录
分析
代码
运行结果
分析
处理一般性的大数求余问题的方法。
pow(a,x) % N
N是一个不超过32位的int型数据,a小于N, 当x较大时,pow(a,x)很可能超过64位,无法整型来表示。
我们希望在求解pow(a, x)的过程中,一旦发现结果超过了N,便令结果mod N。
a的多少次幂刚好超过N呢?
设 pow(a, k-1) <= N < pow(a, k) 则 k = log(N) / log(a) + 1
那么也就是说对于pow(a, y),当y < k时,pow(a, y) <= N,此时不需要模运算;当y达到k时,pow(a, y)刚刚超过N,此时进行模运算即可。
因为x可写成以下形式: x = p * k + q ( 0 <= q <= k-1 ) 所以:pow(a, x) = pow(pow(a, k), p) * pow(a, q)
因此
pow(a, x) % N = pow( pow(a, k)%N, p ) * pow(a, q) % N
注意到pow(a, k)%N 和 pow(a, x)%N具有同样的形式,因此对其进行递归求解即可。



