Сейчас идёт (уже прошла) VI интернет-олимпиада на сайте http://neerc.ifmo.ru/school/io/. Предлагаю после окончания обсуждать здесь задачи.
| № | Пользователь | Рейтинг |
|---|---|---|
| 1 | Benq | 3857 |
| 2 | jiangly | 3810 |
| 3 | maroonrk | 3534 |
| 4 | tourist | 3528 |
| 5 | Kevin114514 | 3510 |
| 6 | turmax | 3411 |
| 7 | Um_nik | 3387 |
| 8 | Radewoosh | 3367 |
| 9 | heuristica | 3322 |
| 10 | strapple | 3317 |
| Страны | Города | Организации | Всё → |
| № | Пользователь | Вклад |
|---|---|---|
| 1 | Qingyu | 157 |
| 2 | maspy | 150 |
| 3 | Um_nik | 144 |
| 3 | nik_exists | 144 |
| 5 | Errichto | 139 |
| 6 | adamant | 136 |
| 7 | maroonrk | 134 |
| 8 | DNR | 132 |
| 9 | AmShZ | 131 |
| 10 | Dominater069 | 129 |
Сейчас идёт (уже прошла) VI интернет-олимпиада на сайте http://neerc.ifmo.ru/school/io/. Предлагаю после окончания обсуждать здесь задачи.
| Название |
|---|



Это только у меня не заходит в веб-клиент или ещё у кого-нибудь такие проблемы? Пытался подключиться через обычный клиент, но постоянно "ошибка подключения к серверу". Может нужно его как-нибудь настроить? Может это из-за прокси сервера?
getsputs, а не cout или чего-то еще если на С++.Как можно было рассуждать.
Разобъём все разбиения (каламбур!) на классы эквивалентности относительно циклического сдвига.
Рассмотрим главный период A в разбиении. Понятно, что A | k. Также понятно, что размер класса эквивалентности для этого разбиения сопадает с A.
Пусть F(A) - количество разбиений с главным периодом A. Тем самым получаем, что ответ X = sum(F(A), A=1..k) = sum(F(A), A | k), т.е. F(A) при A не делящем k есть ноль.
Пусть G(a, b) есть количество разбиений числа a на b положительных целых слагаемых. Известным образом оно равно биномиальному коэффициенту C(a + b - 1, b - 1).
Выведем рекуррентную формулу для F(A). Заметим, что любое разбиение с главным периодом A однозначно задаётся своими первыми A числами, которые в сумме должны давать n / A (тем самым, F(A) при A не делящем n тоже равно нулю). Значит, F(A) = G(n / (k / A), A) - sum(F(B), B | A), т. к. мы посчитаем также все разбиений с кратным периодом.
Теперь про асимптотику. Можно рассматривать только делители, например, n, которых не больше тысячи. Получаем решение за O(d(n)^2), где d(n) есть количество делителей числа n.
К слову, O(d(n) ^ 2) это круче чем O(n), потому что d(n) = o(sqrt(n)). Поэтому ещё чуть-чуть и решение Паши начнёт ТЛится, а моё - ещё летать.
UPD: А точнее O(min(N, P)).
Вот, что сделал я:
Задача А.
Нужно просто сделать всё так, как сказано в условии.
P.S. Если пишите на С++, не нужно использовать cin/cout – будет ТЛ.
Задача B.
Заведём булевский двухмерный массив изначально равный нулю. Потом при добавлении каждого корабля на карту проверяем ни пересекается ли новый корабль с каким-нибудь старым. Если пересекается выводим «INCORRECT». Для удобства перед добавлением очередного корабля можно увеличить его размеры на 1 в каждую сторону, а в конце останется посчитать количество клеток равных нулю.
Задача С.
Простое рекурсивное решение. Изначально проверяю: если количество пустых клеток ни делится на 4 вывожу NIE. Дальше вызываю рекурсию и пока нужно добавлять фигурки перебираю все возможные на все возможные позиции с всеми возможными поворотами.
P.S. хотелось бы увидеть разбор по D.
мне кажется перебор тут не совсем проходит, ну например, как долго у вас работает ваше решение на тесте
6 6
1 2 0 1 2 3 3
...#..
##....
......
#.....
......
......
Да, действительно - ответа я не дождался.
Кто-нибудь может объяснить нормальное решение?
6 6
9 9 9 9 9 9 9
......
......
......
......
......
.....#
На нём, если не ставить проверку на чётность, у меня работает 0.38 sec.
К слову, мой перебор в TL укладывается вполть до поля 7x7.