字节笔试题,求大数对(1e9+7)值取模结果

求2的100万次方对(1e9+7)取模的结果

提示 A=B*C,则 A   m o d   x = ( ( B   m o d   x ) ) × ( C   m o d   x ) )   m o d   x A\bmod x = \left( {\left( {B\bmod x} \right)) \times \left( {C\bmod x} \right)} \right)\bmod x Amodx=((Bmodx))×(Cmodx))modx

使用分治法

2 1000000 = 2 500000 × 2 500000 {2^{1000000}} = {2^{500000}} \times {2^{500000}} 21000000=2500000×2500000

最开始根本没有想到用分治法,简直太菜,考完了才想到,当时只想到用递归,但是没有从分治的角度想问题,从1开始尝试2的多少次方可以对(1e9+7)取模。笔试结束后回宿舍好好想了想,为啥不用分治法,话不多说,上代码吧

import math

def merge(array):
    """
    merge
    @para: array, list
    """
    res = 1
    for temp in array:
        res = int((res*temp)%(1e9+7))
    return res

def divide_and_conquer(num1, num2):
    """
    用分治法求(2^100w)%(1e9+7)
    @para: num1,数字1
    @para: num2,次方
    """
    if (num2==1) or (num2==0):
        temp = num2
        return int(math.pow(num1,temp)%(1e9+7))
    lst = [int(num2/2), num2 - int(num2/2)]
    y_res = list()
    for i in range(2):
        y_res.append(divide_and_conquer(num1, lst[i]))
    return merge(y_res)


if __name__ == "__main__":
    print(divide_and_conquer(2, 1000000))

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页