跳到主要内容

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

· 阅读需 1 分钟
lailai
Blogger

原题链接

题意简述

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

i=lrj=i+1r[aji]\sum_{i=l}^{r}\sum_{j=i+1}^r[a\mid j-i]

解题思路

i=lrj=i+1r[aji]=d=1rl[ad](rld+1)=k=1rla(rlka+1)=k=1rla(rl+1)ak=1rlak=rla(rl+1)arla(rla+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}

参考代码

#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;
}