Giả sử bạn có một cái chết 20 mặt. Bạn bắt đầu lăn cái chết đó và phải lăn nó vài chục lần trước khi cuối cùng bạn cuộn tất cả 20 giá trị. Bạn tự hỏi, tôi cần bao nhiêu cuộn trước khi tôi có 50% cơ hội nhìn thấy tất cả 20 giá trị? Và n
tôi cần phải lăn bao nhiêu cuộn một mặt trước khi lăn tất cả các n
mặt?
Sau một số nghiên cứu, bạn phát hiện ra rằng một công thức tồn tại để tính cơ hội cán tất cả các n
giá trị sau khi r
cuộn.
P(r, n) = n! * S(r, n) / n**r
trong đó S(a, b)
biểu thị số Stirling của loại thứ hai , số cách phân vùng một tập hợp n đối tượng (mỗi cuộn) thành k tập con không rỗng (mỗi bên).
Bạn cũng tìm thấy những dãy OEIS , mà chúng tôi sẽ gọi R(n)
, mà tương ứng với nhỏ r
nơi P(r, n)
ít nhất là 50%. Thách thức là tính toán số hạng n
thứ ba của chuỗi này càng nhanh càng tốt.
Các thách thức
- Cho một
n
, tìm nhỏ nhấtr
trong đóP(r, n)
lớn hơn hoặc bằng0.5
hoặc 50%. - Về mặt lý thuyết, mã của bạn sẽ xử lý bất kỳ số nguyên không âm nào
n
làm đầu vào, nhưng chúng tôi sẽ chỉ kiểm tra mã của bạn trong phạm vi1 <= n <= 1000000
. - Cho điểm, chúng tôi sẽ mất tổng thời gian cần thiết để chạy
R(n)
trên đầu vào1
thông qua10000
. - Chúng tôi sẽ kiểm tra xem các giải pháp của bạn có đúng hay không bằng cách chạy phiên bản
R(n)
đầu ra của chúng tôi để xem liệuP(your_output, n) >= 0.5
vàP(your_output - 1, n) < 0.5
, tức là đầu ra của bạn thực sự là nhỏ nhấtr
cho một sản phẩm nhất địnhn
. - Bạn có thể sử dụng bất kỳ định nghĩa cho
S(a, b)
trong giải pháp của bạn. Wikipedia có một số định nghĩa có thể hữu ích ở đây. - Bạn có thể sử dụng các giải pháp tích hợp trong các giải pháp của mình, bao gồm cả những giải pháp tính toán
S(a, b)
hoặc thậm chí là những giải pháp tính toánP(r, n)
trực tiếp. - Bạn có thể mã hóa tối đa 1000 giá trị
R(n)
và một triệu số Stirling, mặc dù cả hai đều không phải là giới hạn cứng và có thể thay đổi nếu bạn có thể đưa ra một lập luận thuyết phục cho việc tăng hoặc giảm chúng. - Bạn không cần phải kiểm tra mọi thứ có thể
r
giữan
vàr
chúng tôi đang tìm kiếm, nhưng bạn cần phải tìm ra cái nhỏ nhấtr
và không phải bất cứr
nơi nàoP(r, n) >= 0.5
. - Chương trình của bạn phải sử dụng ngôn ngữ có thể chạy tự do trên Windows 10.
Các thông số kỹ thuật của máy tính sẽ kiểm tra các giải pháp của bạn i7 4790k, 8 GB RAM
. Cảm ơn @DJMcMayhem đã cung cấp máy tính của anh ấy để thử nghiệm. Vui lòng thêm thời gian không chính thức của bạn để tham khảo, nhưng thời gian chính thức sẽ được cung cấp sau khi DJ có thể kiểm tra nó.
Các trường hợp thử nghiệm
n R(n)
1 1
2 2
3 5
4 7
5 10
6 13
20 67 # our 20-sided die
52 225 # how many cards from a huge uniformly random pile until we get a full deck
100 497
366 2294 # number of people for to get 366 distinct birthdays
1000 7274
2000 15934
5000 44418
10000 95768
100000 1187943
1000000 14182022
Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi hoặc đề nghị. Chúc may mắn và tối ưu hóa tốt!