Блог пользователя abzaloid

Автор abzaloid, 13 лет назад, По-русски

1) Факторизация факториала


Сперва решетом находим все простые числа от 1 до N. Понятно, что все эти числа и есть делители N!,
потому что N! = 1 * 2 * ... * N
И записываем простые числа в массив p[]
То есть он будет выглядеть так: p[1] = 2, p[2] = 3, p[3] = 5, ...

Требуется посчитать, с какой степенью простой делитель p входит в число N!,
 т.е. найти наибольшее x такое, что N! делится на px.

Теперь как надо искать x для p?

 
Конечно, не до бесконечности, потому что берем только целую часть. 
Сложность нахождения степени делителя факториала O(logpN)

Итоговая сложность  ≈ O(NlogN), если считать грубо.

2) Реккурентное соотношение


Если посмотреть на ограничения, N ≤ 1018, то легко понять, что можно решать эту задачу за O(1) или за O(logN).
  • Можно воспользоваться быстрым возведением матрицы в N-ую степень за O(logN).
  • Можно найти перебором начальные несколько значений функции, затем найти закономерность(период функции). Скажем период равен P. И просто найти ответ за O(1), т.е. взять N по модулю P и вывести последнюю цифру, т.е. взяв f(N%P) по модулю 10.

3) Постройки


Надо найти количество построений дорог между N центрами, где N ≤ 100.
Можно представить сеть центров, как ориентированный граф с N вершинами. 
Максимум дорог(неориентированных) между вершинами такого графа может быть .
И у каждой дороги(u - v) будет три состояния:
  • u → v.
  • v → u.
  • дорог между u и v вообще нет.
То есть ответ: . Так как ответ может быть большим, надо использовать длинную арифметику.

4) Фея


Надо найти количество таких заполнений бланков ответа из N вопросов по K ответов, чтобы ни в одном варианте заполнения не было ни одного правильного ответа.

Нам дано какое-то множество правильных ответов к каждому вопросу, и мы можем выбрать любой
вариант ответа, кроме правильного. Т.е.,  если есть K ответов, то один из них правильный, а остальные K - 1 неправильные. Всего вопросов N и мы можем выбрать любые K - 1 неправильных ответов. Значит ответ: (K - 1)N. Здесь также нужно воспользоваться длинной арифметикой.

5) Райхан и таблица Менделеева


В данной задаче надо быстро проверять, находиться ли в таблице Менделеева элемент si + si + 1(конкатенация двух символов строки s). 
  • Для этого в C++, можно воспользоваться map'ом. Сложность будет O(NlogM)
  • Так же можно завести буленовый массив 26x26(в паскале можно сделать array['a'..'z', 'a'..'z'] of boolean). И для каждого элемента хранить true, если он есть в таблице Менделеева, иначе false. Или можно просто хранить элементы в хэш-таблице. Тут ограничения не большие и методов много. То есть сложность при таких методах будет O(N)

6) Веревка


Сперва надо отсортировать все окружности по углу(угловая сортировка). Можно было сортировать по тангенсу угла. Дальше надо было придумать формулу для нахождения длины части веревки соединяющей две последовательные окружности. Точную формулу можете вывести сами, для этого нужно знать, как вычислять расстояние между двумя точками в декартовой системе координат, и знать теорему косинусов. 
Сложность будет O(NlogN).

7) Палиндромы


Ограничения в этой задаче N ≤ 102000.
Пусть длина N равна n.
Для длины k, количество палиндромов будет 10[k / 2], где [x] = округленное значение x. Надо сложить все значения для k = 1..n - 1.
 
Теперь рассмотрим палиндромы длины n. Будем считать количество палиндромов так.
если N = abc...xyz, то прибавляем к ответу: 
(a - 1) * 9 * 9 * ... * 9 (до середины, так как это палиндром)
a * (b - 1) * 9 * ... * 9 (так же до середины)
... И так далее.
Cложность будет примерно O(n2).
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
В задаче Райхан и таблица Менделеева я завел array of boolean, но почему-то упорно получал WA. Можете объяснить, почему?

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    может надо было ansistring, там длина может достигать 105. И компилятор не дельфи, а паскаль
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да, возможно.
      А дорешать можно где-нибудь?
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Скоро появиться в архиве задач
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Кстати, немного не в тему, но по поводу архива.

          Сегодня что, рейтинг не пересчитывается?

          Сдал сегодня из архива 5 задач, от первого ацепта прошло уже почти 3 часа, а рейтинг кодера до сих пор не изменился.

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
По третей задаче, для тех, кто не силён в матрицах:
Какую матрицу возводить в степень и в какой ячейке ответ будет лежать? 
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Если d3 = (1, 1, 2, 2)T, где dk - вектор элементов f(k - 3)..f(k), то dk+1 = ((5 -2 1 3), (1 0 0 0), (0 1 0 0), (0 0 1 0)) * dk. Тогда можно посчитать dn, первым элементом которого будет f(n).