canuc80k0847·48/50

Tổng Các Ước Trên Một Đoạn Đầu

Nộp bài trên LQDOJ

Bài 08 · Arithmetic

Với số nguyên dương , ký hiệu σ(x) là tổng tất cả ước dương của .

Cho , hãy tính

và in phần dư của kết quả khi chia cho .

Input

  • Một dòng chứa số nguyên .

Output

  • In giá trị tổng theo modulo .

Constraints

  • .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

10

Output

87

Giải thích: Các tổng ước từ tới lần lượt là ; cộng lại được .

Lời giải tóm tắt
  • Biến đổi tổng: Mỗi ước d xuất hiện trong σ(x) đúng khi d chia hết x. Trong đoạn 1..N có floor(N/d) bội của d, vì vậy
  • Biến đổi tổng: Σ_{x=1..N} σ(x) = Σ_{d=1..N} d·floor(N/d).
  • Biến đổi tổng: Không thể duyệt tới N=10^12. Tuy nhiên, giá trị floor(N/d) không đổi trên một đoạn liên tiếp. Nếu đang ở l, đặt q=floor(N/l) thì điểm cuối lớn nhất cùng thương là r=floor(N/q). Đóng góp của cả đoạn là
  • Biến đổi tổng: q·(l+(l+1)+...+r).
  • Chứng minh đúng: Phép đổi thứ tự đếm gán cho mỗi cặp (d,x) với d|x đúng một đóng góp d, nên công thức đầu bằng tổng cần tìm. Các đoạn [l,r] do thuật toán tạo rời nhau, phủ toàn bộ 1..N và trong mỗi đoạn có cùng thương q; tổng cấp số cộng vì vậy tính đúng đóng góp của mọi d. Cộng các đoạn cho kết quả chính xác.
  • Độ phức tạp: Số thương khác nhau là O(sqrt(N)), nên thời gian O(sqrt(N)), bộ nhớ O(1).