아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

극한의 gcd 합

시간 제한4초메모리 제한256 MB

요약
n개 구간에서 각각 하나씩 고른 모든 튜플의 최대공약수를 합한 뒤 1,000,000,007로 나눈 나머지를 구합니다.
난이도

어려움10점 중 8점

유형
정수론, 수학
정답자
아직 제출이 없습니다

문제

정수 상수 a1,b1,…,an,bna_1, b_1, \dots, a_n, b_n의 값이 주어진다. 아래 코드를 끝까지 실행했을 때 sum에 최종적으로 어떤 값이 저장되는지 구하라.

sum = 0;
for (x1 = a1; x1 <= b1; x1++)
    for (x2 = a2; x2 <= b2; x2++)
        ...
            for (xn = an; xn <= bn; xn++)
                sum = sum + gcd(x1, x2, ..., xn);

gcd는 인자로 받은 x1,x2,…,xnx_1, x_2, \dots, x_n의 최대공약수를 돌려주는 함수이고, sum은 아무리 큰 정수라도 담는 변수다.

너무 쉬워 보이나요? 저도 그렇게 생각합니다.

입력

첫째 줄에 자연수 nn이 주어진다.

다음 nn개 줄 가운데 ii번째 줄에는 aia_i와 bib_i가 공백으로 구분되어 주어진다.

1≤n≤10 0001 \le n \le 10\,000, 1≤ai≤bi≤1 000 0001 \le a_i \le b_i \le 1\,000\,000이다.

출력

C/C++에는 아무리 큰 정수라도 담는 자료형이 없으므로, sum의 값을 1 000 000 0071\,000\,000\,007로 나눈 나머지를 한 줄에 출력한다.

예제3

  1. 예제 1

    입력
    3
    1 7
    1 5
    1 3
    
    예상 출력
    115
    
  2. 예제 2

    입력
    1
    1 1
    
    예상 출력
    1
    
  3. 예제 3

    입력
    2
    4 6
    9 12
    
    예상 출력
    28