---
tags: VNOJ, Olympic, Olympic Sinh Vien, Math, Implementation, SPyofgame
---
Olympic Sinh Viên 2020 - Chuyên tin - Sơn phản quang
===
[https://oj.vnoi.info/problem/olp_ct20_reflective](https://oj.vnoi.info/problem/olp_ct20_reflective)
-----
###### tags: `Math`, `Implementation`
-----
### Hướng dẫn
Gọi hàm $f(l, r)$ là chi phí để sơn một đoạn $[l, r]$
Gọi hàm $[x = y]$ trả về $1$ khi $x = y$ và trả về $0$ khi $x \neq y$
Xét tại $x$, ta có phần diện tích bị phủ là $f(x, x) = max\Large\left(\normalsize k\ \ \Large|\ \ \normalsize \frac{x}{2^k} \in Z \wedge\ \normalsize \frac{x}{2^{k+1}} \notin Z \Large\right)$
Ta có
$f(0, n)
= \overset{n}{\underset{x = 0}{\Large \Sigma}} max\Large\left(\normalsize k\ \ \Large|\ \ \normalsize \frac{x}{2^k} \in Z \wedge\ \normalsize \frac{x}{2^{k+1}} \notin Z \Large\right) \normalsize
= \overset{n}{\underset{x = 0}{\Large \Sigma}} \overset{\log_2(x)}{\underset{k = 1}{\Large \Sigma}} \Large\left[\normalsize \frac{x}{2^k} \in \mathbb{Z} \Large\right] \normalsize
= \overset{\log_2(n)}{\underset{k = 1}{\Large \Sigma}} \overset{n}{\underset{x = 0}{\Large \Sigma}} \Large\left[\normalsize x = 2^k\Large\right] \normalsize
= \overset{\log_2(n)}{\underset{k = 1}{\Large \Sigma}} \Large \left \lfloor \normalsize \frac{n}{2^k} \Large \right \rfloor$
Ta có kết quả của bài toán $f(l, r) = f(0, r) - f(0, l - 1)$
Độ phức tạp: $O(\log_2(n))$ thời gian - $O(1)$ bộ nhớ
-----
### Code
> **Time:** $O(log_2\ n)$
> **Space:** $O(1)$
> **Algo:** Math, Implementation
>
```cpp=
#include <iostream>
using namespace std;
typedef long long ll;
ll f(ll n)
{
ll res = 0;
for (ll x = 2; x <= n; x *= 2)
res += n / x;
return res;
}
int main()
{
ll l, r;
cin >> l >> r;
cout << f(r) - f(l - 1);
return 0;
}
```