Научная статья на тему 'Применение БПФ в задачах спортивного программирования'

Применение БПФ в задачах спортивного программирования Текст научной статьи по специальности «Математика»

CC BY
618
58
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
дискретное преобразование Фурье / программирование / discrete Fourier transform / competitive programming

Аннотация научной статьи по математике, автор научной работы — Н О. Котелина

В этой статье рассматривается использование БПФ для решения одной задачи спортивного программирования.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

The application of FFT in problems of competitive programming

In this paper the use of FFT in problems of competitive programming is considered.

Текст научной работы на тему «Применение БПФ в задачах спортивного программирования»

ИНФОРМАТИКА

Вестник Сыктывкарского университета. Серия 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

i Надоели баннеры? Вы всегда можете отключить рекламу.