Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Xác suất - Thống kê] Monte Carlo bài toán sưu tập phiếu quà tặng (coupon collector)

    Bộ sinh số giả ngẫu nhiên (để kết quả tái lập được, không dùng random thật): Cho số nguyên seed ≥0\ge 0≥0. Đặt s0=seeds_0=\text{seed}s0​=seed. Với i=1,2,3,…i=1,2,3,\dotsi=1,2,3,…: si=(1103515245⋅si−1+12345) mod 231.s_i = (1103515245 \cdot s_{i-1} + 12345) \bmod 2^{31}.si​=(1103515245⋅si−1​+12345)mod231. Số ngẫu nhiên thứ iii là ui=si/231∈[0,1)u_i = s_i / 2^{31} \in [0,1)ui​=si​/231∈[0,1). Dãy u1,u2,u3,…u_1,u_2,u_3,\dotsu1​,u2​,u3​,… được lấy theo ĐÚNG thứ tự này, dùng tuần tự trong suốt quá trình mô phỏng.

    Bài toán: Có nnn loại phiếu quà tặng (2≤n≤5002\le n\le 5002≤n≤500, riêng n=1n=1n=1 vẫn hợp lệ). Mỗi lượt rút phiếu, ta nhận được ngẫu nhiên đều một trong nnn loại. Bài toán sưu tập phiếu (coupon collector) hỏi: cần rút bao nhiêu lượt để có đủ cả nnn loại?

    Mô phỏng MMM lần thí nghiệm độc lập (thứ tự số ngẫu nhiên dùng tuần tự toàn cục qua các lần thí nghiệm, lần thí nghiệm trước dùng xong mới sang lần sau). Ở thí nghiệm thứ jjj, tại lượt rút thứ ttt (tính từ 1, tăng dần không giới hạn theo từng lượt), lấy số ngẫu nhiên kế tiếp uuu và xác định loại phiếu nhận được là type=⌊u⋅n⌋+1\text{type} = \lfloor u\cdot n\rfloor + 1type=⌊u⋅n⌋+1 (thuộc 1..n1..n1..n). Tiếp tục rút cho đến khi đã nhận đủ nnn loại KHÁC NHAU, gọi DjD_jDj​ là số lượt đã rút.

    Để đảm bảo chương trình luôn dừng, giới hạn an toàn MAXDRAW=20000\text{MAXDRAW} = 20000MAXDRAW=20000: nếu rút đến lượt thứ 200002000020000 mà vẫn CHƯA đủ nnn loại, dừng lại và quy ước Dj=20000D_j = 20000Dj​=20000.

    Sau MMM thí nghiệm, in ra:

    1. Số lượt rút trung bình Dˉ=(∑jDj)/M\bar D = \left(\sum_j D_j\right)/MDˉ=(∑j​Dj​)/M (làm tròn 6 chữ số thập phân; quy ước =0=0=0 nếu M=0M=0M=0).
    2. Số lượt rút lớn nhất max⁡jDj\max_j D_jmaxj​Dj​ trong MMM thí nghiệm (số nguyên; quy ước =0=0=0 nếu M=0M=0M=0).

    Ví dụ: n=3, M=2, seed=1n=3,\ M=2,\ \text{seed}=1n=3, M=2, seed=1 → 4.500000 5.

    • Định dạng đầu vào:

      Một dòng gồm 3 số nguyên n M seedn\ M\ \text{seed}n M seed (1≤n≤5001\le n\le 5001≤n≤500; 0≤M≤2000\le M\le 2000≤M≤200; 0≤seed<2310\le \text{seed}<2^{31}0≤seed<231).

    • Định dạng đầu ra:

      Dˉ\bar DDˉ (6 chữ số thập phân) và max⁡jDj\max_j D_jmaxj​Dj​ (số nguyên), cách nhau khoảng trắng.

    Ví dụ:

    Đầu vào:

    1 0 1

    Đầu ra:

    0.000000 0
    

    Đầu vào:

    1 1 1

    Đầu ra:

    1.000000 1
    

    Đang tải editor...