Сейчас идёт (уже прошла) VI интернет-олимпиада на сайте http://neerc.ifmo.ru/school/io/. Предлагаю после окончания обсуждать здесь задачи.
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 166 |
2 | maomao90 | 163 |
2 | Um_nik | 163 |
4 | atcoder_official | 161 |
5 | adamant | 160 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | nor | 153 |
9 | Dominater069 | 153 |
Сейчас идёт (уже прошла) 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.