Спочатку розрахуємо ймовірність \overline{p(n)} того, що в групі з осіб всі дні народження будуть різними. Якщо більше , то за принципом Діріхле ця ймовірність дорівнює нулю. Якщо ж не перевищує , міркуємо наступним чином.
Вибираємо першу людину і запам'ятовуємо її день народження. Потім вибираємо другу людину: ймовірність того, що її день народження не співпаде з днем народження першого, дорівнює 1 - 1 / 365. Для третьої людини ймовірність того, що її день народження не співпаде з днями народження перших двох, дорівнює 1 - 2 / 365.
Продовжуючи аналогічні міркування, для останньої людини ймовірність того, що її день народження не співпаде з днями народження всіх попередніх, дорівнює 1 - (n - 1) / 365.
Перемножуючи всі ці ймовірності, отримуємо ймовірність того, що всі дні народження в групі будуть різними:
Тоді ймовірність того, що хоча б у двох осіб з співпадуть дні народження, дорівнює одиниці мінус ймовірність того, що всі дні народження різні:
Реалізація алгоритму
У масиві будемо зберігати значення відповідних ймовірностей .
double p[401];Нехай p[1] = 1. Інші значення масиву обчислюємо за формулою, наведеною в аналізі задачі.
p[1] = 1.0;
for (i = 2; i < 401; i++)
p[i] = p[i-1] * (1.0 - (i - 1.0) / 365);Для кожного вхідного значення обчислюємо відповідну ймовірність і виводимо результат.
while (scanf("%d",&n) == 1)
printf("%.8lf%%\n",(1 - p[n]) * 100);