1 条题解
-
0
题意理解
我们有三个整数:
- :可以开始测量的最早时间(整点)
- :可以开始测量的最晚时间(整点)
- :星球自转周期(小时)
要求选择两个时间 满足:
- 是 的倍数
问有多少对 。
思路分析
条件 是 的倍数 意味着:
其中 ,且 。
所以对于每个 ,满足条件的 的个数为: $ \text{count}(i) = \left\lfloor \frac{r - i}{a} \right\rfloor $ 因为 最小是 1,最大是 向下取整。
数学化简
我们要求: $ S = \sum_{i=l}^{r-1} \left\lfloor \frac{r - i}{a} \right\rfloor $ 令 ,当 时 ,当 时 。
所以: $ S = \sum_{x=1}^{r-l} \left\lfloor \frac{x}{a} \right\rfloor $
快速计算
设 。
对于 :显然和为 0(因为所有 )。
对于 :
$ \sum_{x=1}^{n} \left\lfloor \frac{x}{a} \right\rfloor = \sum_{k=1}^{\lfloor n/a \rfloor} \sum_{x=1}^{n} [\lfloor x/a \rfloor = k] $ 对于固定的 ,满足 的 范围是 ,个数为: 但更简单的方法是:
$ \sum_{x=1}^{n} \lfloor x/a \rfloor = a \cdot \frac{m(m-1)}{2} + m \cdot (n - ma + 1) $ 其中 。
解释:
- 对于商 ,每个商出现 次。
- 商 出现 次。
所以: $ S = a \cdot \frac{m(m-1)}{2} + m \cdot (n - ma + 1) $ 其中 ,。
最终公式
$ \text{ans} = \begin{cases} 0, & \text{if } a > n \\ a \cdot \frac{m(m-1)}{2} + m \cdot (n - m a + 1), & \text{otherwise} \end{cases} $ 其中 ,。
代码实现
#include <iostream> using namespace std; int main() { long long l, r, a; cin >> l >> r >> a; long long n = r - l; if (a > n) { cout << 0 << endl; return 0; } long long m = n / a; long long ans = a * m * (m - 1) / 2 + m * (n - m * a + 1); cout << ans << endl; return 0; }
复杂度
- 时间复杂度:
- 空间复杂度:
样例验证
样例 1
l=1, r=5, a=2 n = 4 a <= n → m = 4/2 = 2 ans = 2*2*1/2 + 2*(4 - 2*2 + 1) = 2 + 2*(1) = 4 输出 4 ✓样例 2
l=4, r=9, a=6 n = 5 a > n → 输出 0 ✓
- 1
信息
- ID
- 3522
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者