#
# 寻找所有能整除 2021 的数对个数
# @param a long长整型
# @param b long长整型
# @param c long长整型
# @param d long长整型
# @return long长整型
#
class Solution:
def __get_num(self, a, b, t):
# [1, a)有多少个t倍数
cnt_1_a_t = (a-1) // t
# [1, b] 有多少个t倍数
cnt_1_b_t = b // t
return cnt_1_b_t - cnt_1_a_t
def __get_same_num(self, a, b, c, d, tt):
# 边界条件
if b < c:
return 0
left = max(a, c)
right = min(b, d)
return self.__get_num(left, right, tt)
def findPairs(self , a , b , c , d ):
# write code here
# 边界条件
if a > c:
a, b, c, d = c, d, a, b
# 求[a, b], 有多少个43的倍数,有多少个47的倍数, 有多少个43*47的倍数
cnt_a_b_43 = self.__get_num(a, b, 43)
cnt_a_b_47 = self.__get_num(a, b, 47)
cnt_a_b_2021 = self.__get_num(a, b, 2021)
cnt_c_d_43 = self.__get_num(c, d, 43)
cnt_c_d_47 = self.__get_num(c, d, 47)
cnt_c_d_2021 = self.__get_num(c, d, 2021)
cnt_a_b_c_d_2021 = self.__get_same_num(a, b, c, d, 2021)
rnt = (cnt_a_b_43 - cnt_a_b_2021) * (cnt_c_d_47 - cnt_c_d_2021) + \
(cnt_a_b_47 - cnt_a_b_2021) * (cnt_c_d_43 - cnt_c_d_2021) + \
cnt_a_b_2021 * (d-c+1 - cnt_a_b_c_d_2021) + \
cnt_c_d_2021 * (b-a+1 - cnt_a_b_c_d_2021) + \
cnt_a_b_c_d_2021**2
return rnt