Сегодня моя невеста пригласила меня на ужин, чтобы отпраздновать мой день рождения. Пока мы отсутствовали, я слышал, как Happy Birthday пели 5 разных гостей (включая меня) в ресторане, в котором было 50 человек. Это заставило меня задуматься - оригинальная проблема дня рождения (определение вероятности того, что 2 человека в комнате N
людей имеют одинаковый день рождения) очень проста и понятна. Но как насчет расчета вероятности того, что по крайней мере k
люди из N
людей будут иметь одинаковый день рождения?
Если вам интересно, вероятность того, что по крайней мере 5 человек из 50 всех людей, имеющих общий день рождения, составляет около 1/10000.
Соревнование
Учитывая два целых числа N
и k
, где N >= k > 0
, выведите вероятность того, что по крайней мере k
люди в группе N
людей будут иметь одинаковый день рождения. Для простоты предположим, что всегда есть 365 возможных дней рождения и что все дни одинаково вероятны.
Для k = 2
, это сводится к исходной задаче по случаю дня рождения, а вероятность 1 - P(365, N)/(365)**N
(где P(n,k)
это число к-длине перестановок , образованных из п элементов ). Для больших значений k
, эта статья Wolfram MathWorld может оказаться полезной.
правила
- Вывод должен быть детерминированным и максимально точным для выбранного вами языка. Это означает отсутствие оценки Монте-Карло или приближения Пуассона.
N
иk
будет не больше наибольшего представимого целого числа на выбранном вами языке. Если выбранный вами язык не имеет жесткого максимума целых чисел (кроме ограничений памяти), тоN
иk
может быть сколь угодно большим.- Ошибки точности, возникающие из-за неточностей с плавающей запятой, могут быть проигнорированы - ваше решение должно предполагать идеально точные, бесконечно точные поплавки.
Тестовые случаи
Формат: 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)
Ответы:
Желе ,
1716 байтовКрайне неэффективно. Попробуйте онлайн! (но держите N ниже 3 )
Как это устроено
источник
k > 1
, а затемk <= N
, если вы хотите сохранитьN < 3
, это не оставляет большого выбора для значенийN
иk
вы можете попробовать.MATL , 16 байт
Первый вход есть
N
, второй естьk
.Попробуйте онлайн!
Это основанный на перечислении подход, подобный ответу Дженни Денниса , поэтому входные числа должны быть небольшими из-за ограничений памяти.
источник
J
4136 байтПрямой подход, похожий на другие. Встречается с проблемами памяти при n> 3 .
использование
Принимает значение
k
на LHS иn
RHS.На моем компьютере, используя i7-4770k и таймер чужой
6!:2
, вычисление для n = 3 требует около 25 секунд.объяснение
источник