Với số nguyên không âm n, định nghĩa dãy nhị phân F(n):
- Nếu n≤1,F(n) chỉ gồm phần tử n.
- Nếu n>1,F(n)=F(⌊n/2⌋), tiếp theo là nmod2, rồi lại F(⌊n/2⌋).
Các vị trí đánh số từ 1. Cho l,r, hãy đếm số phần tử bằng 1 trong đoạn [l,r].
Input
Một dòng chứa n,l,r.
Output
In số lượng bit 1.
Constraints
0≤n≤1018 và 1≤l≤r≤∣F(n)∣.
Scoring
Subtask 1 (50 điểm): n≤106.
Subtask 2 (50 điểm): không có giới hạn bổ sung.
Example
Test 1
Input
5 2 6
Output
3
Giải thích: F(5)=1,0,1,1,1,0,1; đoạn vị trí 2,…,6 là 01110, có ba bit 1.
Lời giải tóm tắt
Dãy F(n) gồm F(⌊n/2⌋), bit n mod 2, rồi F(⌊n/2⌋). Tổng số bit 1 trong toàn bộ F(n) đúng bằng n.
Tính pre(n,k): số bit 1 trong k vị trí đầu. Nếu lấy cả dãy, trả n; nếu chỉ lấy một phần, xác định vị trí cắt nằm ở nửa trái, bit giữa hay nửa phải.
Chỉ đệ quy vào nửa bị cắt; phần đã lấy trọn cộng ngay bằng ⌊n/2⌋. Kết quả cần tìm là pre(n,r) − pre(n,l−1).
Code hiện tại tính lại độ dài dãy ở mỗi mức nên mất O(log² n), ngăn xếp O(log n); không tạo dãy có kích thước rất lớn.