Malam ini, tunanganku mengajakku makan malam untuk merayakan ulang tahunku. Ketika kami keluar, saya mendengar Selamat Ulang Tahun dinyanyikan untuk 5 tamu yang berbeda (termasuk saya), di sebuah restoran yang penuh dengan 50 orang. Ini membuat saya bertanya-tanya - masalah ulang tahun yang asli (menemukan kemungkinan bahwa 2 orang di ruangan N
orang berbagi ulang tahun yang sama) sangat sederhana dan mudah. Tetapi bagaimana dengan menghitung probabilitas bahwa setidaknya k
orang dari N
orang yang berbagi ulang tahun yang sama?
Jika Anda bertanya-tanya, probabilitas setidaknya 5 orang dari 50 total orang berbagi ulang tahun yang sama adalah sekitar 1/10000.
Tantangan
Diberi dua bilangan bulat N
dan k
, di mana N >= k > 0
, menghasilkan probabilitas bahwa setidaknya k
orang dalam kelompok N
orang berbagi ulang tahun yang sama. Untuk mempermudah, anggap selalu ada 365 hari ulang tahun, dan kemungkinan besar semua hari sama.
Untuk k = 2
, ini bermuara pada masalah ulang tahun asli, dan probabilitas adalah 1 - P(365, N)/(365)**N
(di mana P(n,k)
adalah jumlah permutasi k-panjang terbentuk dari unsur-unsur n ). Untuk nilai yang lebih besar k
, artikel Wolfram MathWorld ini mungkin terbukti bermanfaat.
Aturan
- Keluaran harus deterministik, dan seakurat mungkin untuk bahasa pilihan Anda. Ini berarti tidak ada estimasi Monte Carlo atau perkiraan Poisson.
N
dank
tidak akan lebih besar dari integer representable terbesar dalam bahasa pilihan Anda. Jika bahasa yang Anda pilih tidak memiliki hard maksimum pada bilangan bulat (selain dari kendala memori), makaN
dank
mungkin besar secara sewenang-wenang.- Kesalahan akurasi yang berasal dari ketidakakuratan floating-point mungkin diabaikan - solusi Anda harus mengasumsikan mengapung sempurna akurat, presisi tak terbatas.
Uji Kasus
Format: k, N -> exact fraction (float approximation)
2, 4 -> 795341/48627125 (0.016355912466550306)
2, 10 -> 2689423743942044098153/22996713557917153515625 (0.11694817771107766)
2, 23 -> 38093904702297390785243708291056390518886454060947061/75091883268515350125426207425223147563269805908203125 (0.5072972343239854)
3, 3 -> 1/133225 (7.5060987051979735e-06)
3, 15 -> 99202120236895898424238531990273/29796146005797507000413918212890625 (0.0033293607910766013)
3, 23 -> 4770369978858741874704938828021312421544898229270601/375459416342576750627131037126115737816349029541015625 (0.01270542106874784)
3, 88 -> 121972658600365952270507870814168157581992420315979376776734831989281511796047744560525362056937843069780281314799508374037334481686749665057776557164805212647907376598926392555810192414444095707428833039241/238663638085694198987526661236008945231785263891283516149752738222327030518604865144748956653519802030443538582564040039437134064787503711547079611163210009542953054552383296282869196147657930850982666015625 (0.5110651106247305)
4, 5 -> 1821/17748900625 (1.0259790386313012e-07)
4, 25 -> 2485259613640935164402771922618780423376797142403469821/10004116148447957520459906484225353834116619892120361328125 (0.0002484237064787077)
5, 50 -> 786993779912104445948839077141385547220875807924661029087862889286553262259306606691973696493529913926889614561937/7306010813549515310358093277059651246342214174497508156711617142094873581852472030624097938198246993124485015869140625 (0.00010771867165219201)
10, 11 -> 801/8393800448639761033203125 (9.542757239717371e-23)
10, 20 -> 7563066516919731020375145315161/4825745614492126958810682272575693836212158203125 (1.5672327389589693e-18)
10, 100 -> 122483733913713880468912433840827432571103991156207938550769934255186675421169322116627610793923974214844245486313555179552213623490113886544747626665059355613885669915058701717890707367972476863138223808168550175885417452745887418265215709/1018100624231385241853189999481940942382873878399046008966742039665259133127558338726075853312698838815389196105495212915667272376736512436519973194623721779480597820765897548554160854805712082157001360774761962446621765820964355953037738800048828125 (1.2030611807765361e-10)
10, 200 -> 46037609834855282194444796809612644889409465037669687935667461523743071657580101605348193810323944369492022110911489191609021322290505098856358912879677731966113966723477854912238177976801306968267513131490721538703324306724303400725590188016199359187262098021797557231190080930654308244474302621083905460764730976861073112110503993354926967673128790398832479866320227003479651999296010679699346931041199162583292649095888379961533947862695990956213767291953359129132526574405705744727693754517/378333041587022747413582050553902956219347236460887942751654696440740074897712544982385679244606727641966213694207954095750881417642309033313110718881314425431789802709136766451022222829015561216923212248085160525409958950556460005591372098706995468877542448525403291516015085653857006548005361106043070914396018461580475651719152455730181412523297836008507156692430467118523245584181582255037664477857149762078637248959905010608686740872875726844702607085395469621591502118462813086807727813720703125 (1.21685406174776e-07)
Jawaban:
Jelly ,
1716 byteSangat tidak efisien. Cobalah online! (tapi simpan N di bawah 3 )
Bagaimana itu bekerja
sumber
k > 1
, lalu diberikank <= N
, jika Anda ingin mempertahankannyaN < 3
, itu tidak meninggalkan banyak pilihan untuk nilai-nilaiN
dank
yang dapat Anda coba.MATL , 16 byte
Input pertama adalah
N
, kedua adalahk
.Cobalah online!
Ini adalah pendekatan berbasis enumerasi, seperti jawaban Dennis 'Jelly , jadi angka input harus dijaga tetap kecil karena keterbatasan memori.
sumber
J,
4136 bytePendekatan straight-forward mirip dengan yang lain. Terjadi masalah memori pada n> 3 .
Pemakaian
Mengambil nilai
k
pada LHS dann
pada RHS.Di pc saya, menggunakan i7-4770k dan timer asing
6!:2
, komputasi untuk n = 3 membutuhkan sekitar 25 detik.Penjelasan
sumber