描述
有一个质数p,和两个区间[a,b],[c,d],分别在两个区间中取一个数x,y。求有多少对(x,y)使得x∗y是p的倍数。给定你两个区间,求从区间中取出数相乘是p的倍数的个数。
示例1
输入:
3,7,4,6,3
返回值:
9
说明:
(3,4),(3,5),(3,6),(4,6),(5,6),(6,6),(7,6),(6,4),(6,5)一共有9个
备注:
1≤a≤b≤10^9,1≤c≤d≤10^9,1≤p≤10^9,数据保证p为质数
要计算在两个区间[a, b]和[c, d]中取出数相乘是p的倍数的个数,我们需要考虑每个区间的数被p整除的情况。
对于第一个区间[a, b],能够被p整除的数的数量为floor((b / p) - (a - 1) / p)
(向下取整)。 对于第二个区间[c, d],能够被p整除的数的数量为floor((d / p) - (c - 1) / p)
。
但是,我们还需要考虑到两个区间中都不能被p整除,但两数相乘可以被p整除的情况。即一个数是p的倍数,另一个数不是p的倍数。这种情况的数量可以通过分别计算每个区间内不能被p整除的数的数量再相乘得到,即(b - floor(b / p) * p) * (d - floor(d / p) * p)
。
最后将上述三种情况的计数结果相加即可得到答案。
以下是C++实现:
Cpp
#include <cmath>
class Solution {
public:
long long numbers(int a, int b, int c, int d, int p) {
// 计算第一个区间能被p整除的数的数量
long long count1 = std::floor(double(b) / p) - std::floor(double(a - 1) / p);
// 计算第二个区间能被p整除的数的数量
long long count2 = std::floor(double(d) / p) - std::floor(double(c - 1) / p);
// 计算两个区间中都不能被p整除但相乘后能被p整除的数对数量
long long count3 = (b - std::floor(double(b) / p) * p) * (d - std::floor(double(d) / p) * p);
// 返回总数
return count1 * count2 + count3;
}
};
注意:这个解法假设了题目中的区间都是闭区间,即包含边界值。如果题目中区间是开区间,则需要根据实际情况调整计算方法。同时,由于数据范围较大,这里使用了long long
类型来存储结果,并用std::floor
函数处理浮点数除法以确保正确计算整数部分。