Skip to main content
Original178 words1 min

题解:P11495 [ROIR 2019] 两次测量 (Day 1)

Summary

给定正整数 l、r、a,求区间内所有下标对 i 小于 j 中满足 a 整除 j 减 i 的对数。按差值换元,差值为 d 的下标对有 r 减 l 减 d 加 1 个,只需累加 d 为 a 的倍数的项,等差数列求和后得到仅含 r 减 l 除以 a 下取整的闭式,常数时间直接算出。

题意简述​

给定正整数 l,r,al,r,a,计算:

∑i=lr∑j=i+1r[a∣j−i]\sum_{i=l}^r\sum_{j=i+1}^r[a\mid j-i]

解题思路​

∑i=lr∑j=i+1r[a∣j−i]=∑d=1r−l[a∣d](r−l−d+1)=∑k=1⌊r−la⌋(r−l−ka+1)=∑k=1⌊r−la⌋(r−l+1)−a∑k=1⌊r−la⌋k=⌊r−la⌋(r−l+1)−a⌊r−la⌋(⌊r−la⌋+1)2\begin{aligned} \sum_{i=l}^r\sum_{j=i+1}^r[a\mid j-i] & =\sum_{d=1}^{r-l} [a\mid d](r-l-d+1) \\ & =\sum_{k=1}^{\left\lfloor\frac{r-l}{a}\right\rfloor}(r-l-ka+1) \\ & =\sum_{k=1}^{\left\lfloor\frac{r-l}{a}\right\rfloor}(r-l+1)-a\sum_{k=1}^{\left\lfloor\frac{r-l}{a}\right\rfloor} k \\ & =\left\lfloor\frac{r-l}{a}\right\rfloor(r-l+1)-a\frac{\left\lfloor\frac{r-l}{a}\right\rfloor(\left\lfloor\frac{r-l}{a}\right\rfloor+1)}{2} \end{aligned}

参考代码​

225 Bcpp
#include <bits/stdc++.h>
using namespace std;

using ll=long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll l,r,a;
cin>>l>>r>>a;
cout<<((r-l)/a)*(r-l+1)-a*((r-l)/a)*((r-l)/a+1)/2<<'\n';
return 0;
}