非重复可分红息数(优化)

时间:2018-03-24 07:45:34

标签: python python-3.x algorithm time-complexity

有没有办法改进我的算法,以便在计算时间方面获得最佳算法?

给定一系列非零被除数[A,B](1 <= A,B <= 10 ^ 18),并且一组除数D = {x:1 <= x <= 50 },我想找到[A,B]中非重复红利的总数,可以除以集D中的任何数字。

示例1(不花太多时间)

红利数[1,10]和除数的范围是{2,3,4}

  • 除数2可分割的数字列表:2,4,6,8,10
  • 除数3可分割的数字列表:3,6,9
  • 除数4可分割的数字列表:4,8

所以[1,10] = 7

中非重复可分红利的总数

示例2(花费大量时间)

[A,B] = [79031836253224256, 403892407826392155]
D = {44, 46, 50, 8, 35,41,6,18, 24, 23, 7, 45, 39, 46, 4, 35, 34}
Output: 161802330522861274

Python中的第一个算法版本

def solution(A,B,D):                                                                                                                                                                         
    a = set()                                                                                                      
    for i in range(A,B+1):                                                                                         
            for j in D:                                                                                            
                    if i%j == 0:                                                                                   
                            a.add(i)                                                                               
    # return the count of a                                                                                        
    return len(a)   

if __name__ == "__main__":                                                                                             
        print(solution(1,10,[2,3,4]))                                                                                  

0 个答案:

没有答案