У січні Interviewstreet був другий CodeSprint, який включив питання нижче. Програмна відповідь розміщується, але не містить статистичного пояснення.
(Ви можете ознайомитись з оригінальною проблемою та розміщеним рішенням, увійшовши на веб-сайт Interviewstreet за допомогою кредитів Google, а потім перейдіть до проблеми Coin Tosses з цієї сторінки .)
Викидання монет
У вас є неупереджена монета, яку ви хочете продовжувати кидати, поки не отримаєте N головок поспіль. Ви кинули монету М разів і на диво, всі кидки привели до голови.
Яка очікувана кількість додаткових закидів необхідна, поки ви не отримаєте N голосів поспіль?
Введення:
Перший рядок містить кількість випадків Т. Кожен з наступних T рядків містить два числа N і M.
Вихід:
Виведіть T рядків, що містять відповідь на відповідний тестовий випадок. Роздрукуйте відповідь округленою рівно до двох знаків після коми.
Введення зразка:
4
2 0
2 1
3 3
3 2
Вихід вибірки:
6,00
4,00
0,00
8,00
Зразок Пояснення:
Якщо N = 2 і M = 0, вам потрібно продовжувати кидати монету, поки не отримаєте 2 голови поспіль. Не важко показати, що в середньому потрібно 6 кидків монет.
Якщо N = 2 і M = 1, вам потрібні 2 голови підряд і їх вже є 1. Вам потрібно кинути ще раз незалежно від того. У тому першому киданні, якщо ви отримаєте голови, ви закінчите. В іншому випадку вам потрібно почати спочатку, оскільки скидання лічильників послідовно, і вам потрібно продовжувати кидати монету, поки ви не отримаєте N = 2 голови підряд. Таким чином, очікувана кількість кидок монети становить 1 + (0,5 * 0 + 0,5 * 6) = 4,0 Якщо N = 3 і M = 3, у вас вже є 3 голови, тому більше вам не потрібно.
Усі математичні рівняння, які я придумав, мали правильні відповіді на зразки вхідних даних, наведених вище, але були помилковими для всіх інших наборів вхідних даних (які невідомі). Їх програмне рішення, як видається, вирішує проблему набагато інакше, ніж мій метод «спробувати-прийти-в-рівняння». Може хтось, будь ласка, пояснить, як придумати рівняння, яке вирішило б це?