Hướng dẫn cho Mathematical Algorithms TWK Open ∮ Problem #A - Dãy Số Quyết Định


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: Youtuber_TWK, kyanh_tme

Editorial: Mathematical Algorithms TWK Open Problem #A - Dãy Số Quyết Định

1. Ý tưởng

Xét dãy số ban đầu: \(2, 8, 20, 40, 70, 112, ...\)

Theo gợi ý của đề bài, ta tính hiệu giữa các số liên tiếp (dãy hiệu thứ 1):

  • \(8 - 2 = 6\)
  • \(20 - 8 = 12\)
  • \(40 - 20 = 20\)
  • \(70 - 40 = 30\)
  • \(112 - 70 = 42\)

Dãy hiệu thu được: \(6, 12, 20, 30, 42, ...\)

Tiếp tục lấy hiệu giữa các số liên tiếp trong dãy mới này (dãy hiệu thứ 2):

  • \(12 - 6 = 6\)
  • \(20 - 12 = 8\)
  • \(30 - 20 = 10\)
  • \(42 - 30 = 12\)

Dãy hiệu thứ 2 là một cấp số cộng: 6, 8, 10, 12, ...

Nhìn vào dãy hiệu thứ 1 (6, 12, 20, 30, 42, ...), ta thấy từng số đều có thể phân tích thành tích của hai số nguyên liên tiếp:

  • \(D_1 = 6 = 2 * 3\)
  • \(D_2 = 12 = 3 * 4\)
  • \(D_3 = 20 = 4 * 5\)
    \(...\)
  • \(D_k = (k + 1) * (k + 2)\)

Số thứ N của dãy ban đầu (A_N) sẽ bằng A_1 cộng với tổng các số hạng từ D_1 đến D_(N-1):
\(A_N = 2 + sum_{k=1}^{N-1} (k + 1)(k + 2)\)

Sử dụng công thức tính tổng chuỗi:
\(sum_{i=1}^{M} i(i+1) = (M * (M + 1) * (M + 2)) / 3\)

Rút gọn lại, ta thu được công thức tổng quát trực tiếp cho số thứ N:
\(A_N = (N * (N + 1) * (N + 2)) / 3\)

2.Độ phức tạp:

  • Thời gian: O(1)
  • Không gian: O(1)

Lưu ý: Với \(N \le 10^5\), giá trị \(N * (N + 1) * (N + 2)\) có thể lên tới 10^15, vượt quá giới hạn của kiểu số nguyên 32-bit (int), do đó cần dùng kiểu số nguyên 64-bit (long long trong C++) để tránh tràn số.


Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.