n=R−L+1이라고 하자.
정확히 k개의 수를 선택하여 만들 수 있는 합을 생각하자. 가장 작은 합과 가장 큰 합은 각각
lok=kL+2k(k−1),hi
이다. 연속한 정수에서 서로 다른 k개를 선택하면 이 두 값 사이의 모든 정수 합을 만들 수 있다. 따라서 정확히 k개를 선택하여 만들 수 있는 합은 정수 구간 Ik=[lo를 이룬다.
k가 증가하면 각 구간의 왼쪽 끝점과 오른쪽 끝점이 모두 증가한다. 그러므로 모든 구간 길이의 합에서 이웃한 두 구간이 겹치는 길이를 빼면 합집합의 크기를 얻을 수 있다.
구간 Ik의 길이는
hik−lok+1=k(n−
이다. 모든 구간 길이의 합은
k=1∑n(k(n−k)+
이다.
Ik와 Ik+1이 겹치는 길이는
max(0,hik−lok+
이다. 양수가 되는 조건은
k(n−1−k)≥L
이다.
k(n−1−k)는 대칭이며 k=1,2,…,⌊(n에서 증가한다. 이분 탐색으로 조건을 처음 만족하는 값 를 찾으면 조건을 만족하는 전체 범위는
a≤k≤n−1−a
이다. 조건을 만족하는 값이 없다면 겹치는 길이의 합은 0이다.
b=n−1−a라고 할 때, 빼야 할 길이의 합은
k=a∑b
이다. ∑k와 ∑k2의 공식을 사용해 O(1)에 계산할 수 있다.
모든 계산을 109+7로 나누어 처리한다. 이분 탐색에서 곱을 비교할 때는 64비트 범위를 안전하게 처리하기 위해 128비트 정수를 사용한다.
테스트 케이스 하나당 시간 복잡도는 O(log(R−L+1))이고, 추가 공간 복잡도는 O(1)이다.
Solution written by GPT6