链接:https://vjudge.net/problem/HDU-6286
题意:
给两段区间,问从这两段区间内各选出一个数,能组成多少个有序数对,使得数对里的两个元素乘积为2018的倍数。
思路:
首先注意两点,区间范围是1 ~ 1e9,n^2循环是不存在的了,而本题只能使用O(1)的复杂度;
其次要注意,<2018, 1> 和 <1, 2018> 显然是两个不同的有序对。
接下来讲下大体思路,刚才提到这题正解是O(1)的,那就说明肯定存在某些规律来算答案。
首先,2018这个数,Emmm,其实挺不错的,因为它就4个因子:1,2,1009,2018。
所以我的想法是,先看最大的因子所能决定的有序对个数,找下这两段区间分别有多少数是2018的倍数,然后再用其中一个区间2018倍数的个数乘另一个区间的长度再加和即可,即:
ll sum = 0;
//区间1内2018倍数个数
ll a1 = r / 2018 - l / 2018;
if(l % 2018 == 0) a1++;
//区间2内2018倍数个数
ll a2 = R / 2018 - L / 2018;
if(L % 2018 == 0) a2++;
//ps: 这里要提一下,在某段区间 [l, r] 内找某