Матч 398, Наименьшее расстояние (MinDifference)

Дивизион 2, Уровень 1

 

Заданы числа a0, x, y, m и n. Построим последовательность чисел А согласно следующим рекуррентным соотношениям:

a[0] = a0,

a[i] = (a[i – 1] * x + y) mod m, 0 < i < n

Вычислим все возможные неотрицательные разности между любыми двумя элементами А Найти наименьшее значение среди них.

 

Класс: MinDifference

Метод: int closestElements(int a0, int x, int y, int m, int n)

Ограничения: 1 £ a0, x, y, m £ 10000, 2 £ n £ 10000.

 

Вход. Числа a0, x, y, m и n.

 

Выход. Наименьшее абсолютное значение среди всевозможных разностей двух элементов из последовательности А.

 

Пример входа

a0

x

y

m

n

3

7

1

101

5

3

9

8

32

8

67

13

17

4003

23

 

Пример выхода

6

0

14

 

 

РЕШЕНИЕ

сортировка

 

Сгенерируем в массиве mas элементы последовательности А и отсортируем их. Наименьшая разница между последовательными элементами отсортированного массива является искомой. Ищем ее при помощи функции min_element.

 

ПРОГРАММА

 

#include <cstdio>

#include <cmath>

#include <algorithm>

using namespace std;

 

int i,mas[10000];

 

class MinDifference

{

public:

  int closestElements(int a0, int x, int y, int m, int n)

  {

    mas[0] = a0;

    for(i = 1; i < n; i++) mas[i] = (mas[i-1]*x+y)%m;

    sort(mas,mas+n);

    for(i = 0; i < n; i++) mas[i] = abs(mas[i+1] - mas[i]);

    return *min_element(mas,mas+n-1);

  }

};