trang chủ / bài tập / hilo21 / lời giải

HILO

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Tác giả: huunguyenhuunguyen

Lời giải: HILO

Hướng tiếp cận

Ta cần tính tổng số lần "HILO" xuất hiện trong xâu phản hồi, trên tất cả N! hoán vị, với giá trị bí mật cố định x+0.5.

Thay vì đếm trực tiếp trên mỗi hoán vị, ta sử dụng kỳ vọng tuyến tính (linearity of expectation): tính kỳ vọng số lần "HILO" trên một hoán vị ngẫu nhiên, rồi nhân với N!.

Nhận xét quan trọng

  1. Cấu trúc phản hồi: Mỗi hoán vị tạo ra một xâu phản hồi gồm các ký tự "HI" và "LO". Elsie bỏ qua các lần đoán thừa, nên xâu phản hồi thực chất chỉ chứa các giá trị "không bị loại" — những giá trị thu hẹp khoảng chứa x+0.5.

  2. Chia bài toán:x giá trị nhỏ hơn x+0.5 (cho "LO") và Nx giá trị lớn hơn (cho "HI"). Xâu phản hồi là một hoán vị xen kẽ giữa "HI" và "LO" với các giá trị không bị loại.

  3. Công thức DP: Định nghĩa dp[b][j][k] = kỳ vọng số "HILO" khi:

    • b=0: phản hồi cuối là "LO"; b=1: phản hồi cuối là "HI"
    • j = số giá trị chưa đoán phía dưới x+0.5
    • k = số giá trị chưa đoán phía trên x+0.5

Thuật toán

Cách 1: DP O(N2)

Dựa trên trạng thái (b,j,k), ở mỗi bước giá trị tiếp theo (không bị loại) có xác suất 1j+k là bất kỳ giá trị nào trong j+k giá trị còn lại.

Quan hệ truy hồi:

  • dp[0][j][k]: chọn giá trị dưới (chuyển sang trạng thái LO với j1 giá trị dưới) hoặc giá trị trên (chuyển sang HI).
  • dp[1][j][k]=dp[0][j][k]+jj+k: nếu phản hồi trước là "HI" và bây giờ chọn giá trị dưới, ta có thêm một "HILO".

Tối ưu bằng prefix sum để đạt O(N2).

Cách 2: Công thức đóng O(N)

Sử dụng kỳ vọng tuyến tính và phân tích tổ hợp, ta có công thức đóng:

Với 0<x<N: E[#(HILO)]=12(Hx+HNxHN+NxN)

trong đó Hk=i=1k1i là số điều hòa (harmonic number) bậc k.

Với x=0 hoặc x=N: tất cả phản hồi đều cùng loại ("HI" hoặc "LO"), nên không có "HILO", kết quả là 0.

Đáp án cuối cùng: N!×E[#(HILO)]mod(109+7).

Kiểm tra với ví dụ

N=4, x=2: H2=32, H4=2512.

E=12(32+322512+24)=12·1712=1724

Đáp án: 24×1724=17. Đúng!

Độ phức tạp

  • Thời gian: O(N) (tính số điều hòa và giai thừa)
  • Bộ nhớ: O(N) (bảng nghịch đảo modular)

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0