trang chủ / đề bài / twochand / lời giải

Hai đèn chùm

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

Hướng tiếp cận

Hai đèn lặp lại trạng thái (cặp màu) sau mỗi L=lcm(n,m) ngày. Trong một chu kỳ ta đếm số ngày cùng màu, từ đó suy ra số ngày khác màu, rồi định vị ngày thứ k khác màu.

Nhận xét quan trọng

  1. Chu kỳ chung: trạng thái hệ thống lặp với chu kỳ L=lcm(n,m). Đặt g=gcd(n,m).
  2. Ngày cùng màu: với mỗi màu c xuất hiện trong cả hai dãy, gọi u là vị trí (1-based) trong a và v trong b. Ngày i cùng màu c khi:
    • i≡u(modn)
    • i≡v(modm)
  3. CRT: hệ trên có nghiệm khi và chỉ khi u≡v(modg). Khi có nghiệm, có duy nhất một i∈[1,L] thoả mãn (tìm bằng thuật toán Euclid mở rộng).
  4. Đếm ngày khác màu: gọi M là số màu chung tạo ra ngày cùng màu trong [1,L]. Số ngày khác màu trong một chu kỳ là L−M.

Thuật toán

  1. Tính g=gcd(n,m), L=nm/g.
  2. Lập từ điển vị trí bj→j. Với mỗi ai, kiểm tra có trong b không, nếu có thì thử CRT để lấy ngày t∈[1,L] và thêm vào danh sách matches.
  3. Sắp xếp matches. Số ngày khác màu mỗi chu kỳ: D=L−|matches|.
  4. Số chu kỳ đầy đủ: full=⌊(k−1)/D⌋. Còn lại: r=k−full·D.
  5. Trong một chu kỳ, duyệt qua các đoạn ngày khác màu giữa các phần tử của matches (với L+1 làm sentinel) để tìm ngày khác màu thứ r. Đáp án là full·L+(ngày trong chu kỳ).

Độ phức tạp

  • Thời gian: O((n+m)log(max(n,m))) chính cho sắp xếp matches và tra cứu hashmap.
  • Bộ nhớ: O(n+m).

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.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0