7534. Замкнутое сокровище

 

Группа из n бандитов спрятала украденное сокровище в комнате. Дверь в эту комнату следует отпирать только тогда, когда понадобится вынести сокровище. Поскольку бандиты не доверяют друг другу, они хотят иметь возможность открыть комнату и забрать добычу лишь в том случае, если этого пожелают как минимум m из них.

Они решили установить на дверь несколько замков так, чтобы она открывалась только тогда, когда открыты все замки. Каждый замок может иметь до n ключей, распределённых между некоторым подмножеством бандитов. Группа бандитов может открыть замок тогда и только тогда, когда хотя бы один из членов группы обладает ключом от этого замка.

По заданным значениям n и m определите наименьшее возможное количество замков такое, что при корректном распределении ключей каждая группа, состоящая как минимум из m бандитов, сможет открыть все замки, а никакая группа меньшего размера открыть все замки не сможет.

Например, при n = 3 и m = 2 достаточно 3 замков. Ключи от замка 1 получают бандиты 1 и 2, от замка 2 – бандиты 1 и 3, а от замка 3 – бандиты 2 и 3. Ни один бандит не может открыть все замки в одиночку, однако любая группа из двух бандитов способна открыть их все. Нетрудно убедиться, что в этом случае двух замков недостаточно.

 

Вход. Первая строка содержит количество тестов. Каждая следующая строка является отдельным тестом и содержит два числа n (1 ≤ n ≤ 30) и m (1 ≤ mn).

 

Выход. Для каждого теста в отдельной строке выведите минимальное количество необходимых замков.

 

Пример входа

Пример выхода

4

3 2

5 1

10 7

5 3

3

1

210

10

 

 

РЕШЕНИЕ

комбинаторика

 

Анализ алгоритма

Рассмотрим произвольную группу из m – 1 бандита. По условию она не должна открыть дверь. То есть должен существовать хотя бы один замок, для которого ни у кого из этих m – 1 бандитов нет ключа.

Таким образом, для каждого подмножества бандитов размера m – 1 должен существовать свой замок, ключи от которого не выданы ни одному из них.

 

Рассмотрим конструктивный алгоритм распределения ключей:

·        Для каждого подмножества бандитов размера m – 1 создадим один замок.

·        Ключи от этого замка выдадим всем остальным бандитам, то есть ключи получают n – (m – 1) = nm + 1 человек.

 

Алгоритм корректный, так как:

·        Для группы из m – 1 человек для их собственного замка ни у кого нет ключа. Поэтому дверь не откроется.

·        Рассмотрим группу из m человек. Возьмём любой замок. Он “запрещён” только для одного конкретного набора из m – 1 бандитов. В группе из m человек обязательно есть кто-то вне этого набора. Значит, у группы есть ключ от каждого замка.

 

Минимальное количество необходимых замков равно  количеству подмножеств из n элементов размера m1.

 

Пример

Пусть имеется n = 4 бандита.

При m = 1 количество замков равно  = 1.

 

Замок

Подмножество

Ключи

1

{}

1, 2, 3, 4

 

Каждому бандиту следует дать ключ от единственного замка:

 

При m = 2 количество замков равно  = 4.

 

Замок

Подмножество

Ключи

1

{1}

2, 3, 4

2

{2}

1, 3, 4

3

{3}

1, 2, 4

4

{4}

1, 2, 3

 

Оптимальное распределение замков среди бандитов следующее:

 

 

Любые два бандита смогут открыть все четыре замка и забрать сокровище.

 

При m = 3 количество замков равно  = 6.

 

Замок

Подмножество

Ключи

1

{1, 2}

3, 4

2

{1, 3}

2, 4

3

{1, 4}

2, 3

4

{2, 3}

1, 4

5

{2, 4}

1, 3

6

{3, 4}

1, 2

 

Оптимальное распределение замков среди бандитов следующее:

 

У любых двух бандитов не будет хватать ключа всего лишь от одного замка. Любые три бандита смогут открыть все шесть замков и забрать сокровище.

 

При m = 4 количество замков равно  = 4.

 

Замок

Подмножество

Ключи

1

{1, 2, 3}

4

2

{1, 2, 4}

3

3

{1, 3, 4}

2

4

{2, 3, 4}

1

 

Оптимальное распределение замков среди бандитов следующее:

Для того чтобы открыть все 4 замка, каждый бандит должен принести его единственный уникальный ключ.

 

Рассмотрим случай n = 5, m = 3. Количество замков равно  = 10.

 

Замок

Подмножество

Ключи

Замок

Подмножество

Ключи

1

{1, 2}

3, 4, 5

6

{2, 4}

1, 3, 5

2

{1, 3}

2, 4, 5

7

{2, 5}

1, 3, 4

3

{1, 4}

2, 3, 5

8

{3, 4}

1, 2, 5

4

{1, 5}

2, 3, 4

9

{3, 5}

1, 2, 4

5

{2, 3}

1, 4, 5

10

{4, 5}

1, 2, 3

 

Оптимальное распределение замков среди бандитов следующее:

 

Реализация алгоритма

В ячейках cnk[n][k] вычисляем значения биномиальных коэффициентов .

 

#define MAX 31

long long cnk[MAX][MAX];

 

Функция FillCnk заполняет массив cnk значениями биномиальных коэффициентов.

 

void FillCnk(void)

{

  memset(cnk,0,sizeof(cnk));

  for (int n = 0; n < MAX; n++) cnk[n][0] = 1;

  for (int n = 1; n < MAX; n++)

  for (int k = 1; k <= MAX; k++)

    cnk[n][k] = cnk[n-1][k] + cnk[n-1][k-1];

}

 

Основная часть программы. Вызываем функцию FillCnk.

 

FillCnk();

 

Читаем количество тестов tests.

 

scanf("%d",&tests);

while (tests--)

{

 

Читаем входные данные очередного теста и выводим ответ.

 

  scanf("%d %d",&n,&m);

  printf("%lld\n",cnk[n][m-1]);

}