ИНФОРМАТИКА
Вестник Сыктывкарского университета. Серия 1: Математика. Механика. Информатика. Выпуск 4 (25). 2017
УДК 517.443, 519.688
ПРИМЕНЕНИЕ БПФ В ЗАДАЧАХ СПОРТИВНОГО ПРОГРАММИРОВАНИЯ
Н. О. Котелина
В этой статье рассматривается использование БПФ для решения одной задачи спортивного программирования. Ключевые слова: дискретное преобразование Фурье, программирование.
1. Дискретное преобразование Фурье [2,3]
Пусть имеется многочлен степени меньше п:
А(х) = а0х0 + а1х1 + ... + ап-1хп 1.
Будем считать, что п является степенью 2. Если в действительности это не так, то добавим недостающие коэффициенты, положив их равными нулю.
Обозначим за шп,к = ег~, к = 0,... , п — 1, комплексные корни п-й степени из 1. Очевидно, что все корни шп,к являются степенями главного значения корня п-й степени из единицы шп = шп,1:
_ к шп,к = Шп.
Дискретным преобразованием Фурье (ДПФ) многочлена А(х) или,
что то же самое, ДПФ вектора его коэффициентов а = (а0,а1,..., ап-1)
к
называется вектор у значений этого многочлена в точках Хк = шп, к = 0, . . . , п — 1 :
у = БЕТп(а) = (А(шп), Аи),..., А(^-1)).
© Котелина Н. О., 2017.
Можно определить и обратное дискретное преобразование Фурье Д^Т,-1. Обратным ДПФ для вектора у значений многочлена А(ж) в точках ж к = , к = 0,... , п — 1, называется вектор его коэффициентов а = (ао, Й1,... , ага_1):
а = БЕТп-1(у).
Известно, что ДПФ можно применять для вычисления коэффициентов произведения полиномов [3].
Пусть даны два многочлена А(ж) и В (ж) степени меньше п. Найдем вектор коэффициентов их произведения С (ж) = А(ж)В (ж). Очевидно, что полином С (ж) имеет степень меньше 2п — 1 (и тем более меньше 2п). Пусть с — вектор его коэффициентов (включая нулевые) длины 2п. Если дополнить векторы а и Ь нулевыми коэффициентами до длины 2п, то элементы вектора с можно найти по формуле
к
ск = ^^ а7-Ьk_j, к = 0,..., 2п — 1.
.7=0
Вектор с называется свёрткой векторов а и Ь и обозначается с = а ® Ь.
Справедлива теорема о свёртке, аналогичная теореме 5.1 из книги [4]: Для любых векторов а и Ь размерности п, где п — степень 2, выполнено равенство
с = БЕТ—1 (БЕТ2п(а) ■ БЕТ2п(Ь)),
если дополнить векторы а и Ь нулевыми элементами до длины 2п (точка здесь обозначает поэлементное произведение векторов). Для полноты изложения приведём краткое доказательство теоремы о свёртке.
Доказательство. Рассмотрим г-й элемент вектора БЕТ2п(с):
2га-1 2га-1 к
БЕТ2п(с)[г] = £ ск= £ (]>>Ь^)ш^-7 = к=0 к=0 7=0
2га-1 к 2га-1 2га-1-7
= Ш2таЬк—.ш2(га-7)) = X] а7Ш2П ( X ЬкШ2^) =
к=0 7=0 7=0 к=0 га-1 2,-1-7 га-1 га-1
= X а.ш2,( X Ькш2,) = X а.Ькш2,) =
7=0 к=0 7=0 к=0
= БЕТ2п(а)[г] ■ БЕТ2п(Ь)[г]. Отсюда следует искомая формула. □
2. Быстрое преобразование Фурье
Быстрое преобразование Фурье (fast Fourier transform) — это метод быстрого вычисления ДПФ за время 0(n log n), основанный на свойствах комплексных корней из единицы [2; 3, с. 723].
Быстрое преобразование Фурье использует метод «разделяй и властвуй», который заключается в разделении вектора коэффициентов на два вектора, рекурсивном вычислении ДПФ для них и объединении результатов в одно ДПФ. Для схемы «разделяй и властвуй» известна асимптотическая оценка 0(nlog2 n) [3]. Найти обратное ДПФ, т. е. по вектору значений y полинома A(x) перейти к его вектору коэффициентов a также можно за время 0(n log2 n), если применить тот же алгоритм БПФ, но с другими данными [3], поскольку для ДПФ и обратного ДПФ справедливы формулы
П—1 1 п—1
Ук = Y1 ajШп ' ak = Уз' k = 0' • • • ' n - 1 j=0 3=0
Таким образом, по теореме о свёртке, вектор коэффициентов c произведения A(x)B(x) может быть найден за время 0(2n log2 2n) = 0(nlog2 n).
3. Постановка задачи
Рассмотрим задачу «Вор в магазине» с ресурса [1], которая предлагалась на соревнованиях по спортивному программированию Educational Codeforces Round 9. Условие задачи таково.
Вор пробрался в магазин. Как всегда у него с собой любимый рюкзак. В рюкзаке может поместиться k предметов. В магазине присутствует n типов товаров, причём товаров каждого типа бесконечное количество. Стоимость единицы товара i-го типа равна ai. Вор жадный, поэтому решил набить рюкзак до отказа. Таким образом, он возьмёт с собой ровно k товаров, причём товары некоторых типов он может взять в нескольких экземплярах. Определите всевозможные суммы стоимостей товаров, которые могут оказаться в рюкзаке вора.
Входные данные
В первой строке находится пара целых чисел n и k (1 < n, k < 1000) — количество типов товаров и количество предметов, которые вор украдёт. Во второй строке находятся n целых чисел ai (1 < ai < 1000) — стоимости товаров по типам от 1 до n.
Выходные данные
В единственной строке следует вывести через пробел всевозможные суммы стоимостей товаров, которые могут оказаться в рюкзаке вора. Числа нужно выводить в порядке возрастания.
Нетрудно видеть, что полный перебор всевозможных наборов товаров является неэффективным. Одно из эффективных решений данной задачи использует быстрое преобразование Фурье [1].
Обозначим за W максимально возможную стоимость украденных вором товаров. Тогда W = k max{a^ i G 1 : n} < 106.
Рассмотрим многочлен P степени d = maxja^, i G 1 : n} c целочисленными коэффициентами, коэффициенты которого при степенях а^, i G 1 : n, равны единице, а остальные равны нулю. Тогда при возведении P в степень k получим полином с ненулевыми коэффициентами при степенях {а^ + ■ ■ ■ + aik | 1 < ij < n, j G 1 : k}, при этом коэффициент при степени va/ означает количество способов набрать k товаров с суммарной стоимостью va/. Таким образом, эти степени и являются ответом на задачу. Если возводить полином в степень напрямую, то количество опе-
k(k — 1)
раций умножения будет равно d2 + 2d2 + 3d2 + ■ ■ ■ + (k — 1)d2 = d2-^-
и при максимальных d и k может быть величиной порядка 1012, что при существующих ограничениях на время работы программы слишком много. Покажем, что при помощи БПФ можно быстро возвести полином P в степень k так, чтобы общее число операций не превышало величину порядка 108.
4. Быстрое возведение полинома в степень
Как было замечено выше, при использовании быстрого преобразования Фурье асимптотическая сложность умножения двух полиномов степени n и, следовательно, возведения полинома степени n в квадрат равна 0(n log n). Пусть в нашей задаче максимальная суммарная стоимость товаров равна W, а t = |~log2 W], тогда по условию задачи t < 20. С другой стороны, W — это степень полинома, который получается в результате возведения в степень исходного полинома P. Тогда если дополнить исходный полином нулевыми коэффициентами до степени W, то время работы программы можно оценить следующим образом
(k — 1)W/ogW < 103 220 20 « 2 ■ 1010.
Эта величина все еще является слишком большой, поэтому, чтобы сократить количество умножений полиномов с k — 1 до log2 k, можно воспользоваться алгоритмом бинарного возведения в степень [2; 3, с. 758]. Тогда общее число операций можно оценить так
W/ogW log2 k < 10 ■ 220 20 « 2 ■ 108.
Данное количество операций удовлетворяет временным ограничениям задачи. На практике по времени проходит решение, использующее итеративную, а не рекурсивную реализацию БПФ, поскольку, несмотря на одинаковую асимптотическую сложность, итеративная реализация имеет меньшую константу [2; 3, с. 728].
Список литературы
1. Codeforces (c). Copyright 2010-2017. Михаил Мирзаянов. Соревнования по программированию 2.0. URL: http://codeforces.com. (дата обращения: 12.09.2017).
2. MAXimal. URL: http://e-maxx.ru. (дата обращения: 12.09.2017).
3. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. М.: МЦНМО, 2001. 960 с.
4. Малозёмов В. Н., Машарский С. М. Основы дискретного гармонического анализа. СПб.: Лань, 2012. 302 с.
Summary
Kotelina N. O. The application of FFT in problems of competitive programming
In this paper the use of FFT in problems of competitive programming is considered.
Keywords: discrete Fourier transform, competitive programming. References
1. Codeforces (c). Copyright 2010-2017. Mihail Mirzayanov. Sorevnova-niya po programmirovaniyu 2.0: URL: http://codeforces.com. (date of the application: 12.09.2017).
2. MAXimal. URL: http://e-maxx.ru. (date of the application: 12.09.2017).
3. Kormen T., Leiserson Ch., R. Rivest Algoritmy: postroeniye i analiz (Algorithms: construction and analysis), M.: MCNMO, 2001, 960 p.
4. Malozyomov V. N., Masharsky S. M. Osnovy diskretnogo garmonicheskogo analiza (Fundamentals of discrete harmonic analysis), SPb.: Lan, 2012, 302 p.
Для цитирования: Котелина Н. О. Применение БПФ в задачах спортивного программирования // Вестник Сыктывкарского университета. Сер. 1: Математика. Механика. Информатика. 2017. Вып. 4
(25). C. 44-49.
For citation: Kotelina N. O. The application of FFT in problems of competitive programming, Bulletin of Syktyvkar University. Series 1: Mathematics. Mechanics. Informatics, 2017, №4 (25), pp. 44-49.
СГУ им. Питирима Сорокина
Поступила 20.11.2017