вторник, 17 августа 2010 г.

Разбор задач с acm.timus.ru. Задача 1014

Рассмотрим задачу 1014.

Начнём анализ условия. Известно, что N — произведение цифр Q. Следовательно, будем рассматривать числа от 2 до 9 в качестве сомножителей. Думаю, что ясно, почему 0 и 1 не рассматриваются.

Среди чисел от 2 до 9 простыми являются 2, 3, 5, 7, остальные можно получить как произведение простых, например 6 = 2 × 3. В таком случае факторизация, т.е. разложение исходного числа N на простые сомножители, даст нам цифры, из которых можно составить число, произведение цифр которого равно N.

Теперь озадачимся вопросом минимальности полученного числа. Очевидно, что простые сомножители можно «склеивать» в большие числа. Наибольший эффект даст преобразование трёх двоек в восьмёрку.

Таким образом, мы приходим к следующему алгоритму:
  1. Проверить частные случаи: N = 0 — ответ «10»; N = 1 — ответ «1».
  2. Завести массив K — количеств вхождений каждой цифры в итоговое произведение.
  3. Разложить N как произведение 2, 3, 5, 7 и заполнить K[2], K[3], K[5] и K[7] соответственно.
  4. Если N не раскладывается на такое произведение, то решения нет.
  5. Если же раскладывается, то последовательно пытаться выполнить преобразования произведения простых чисел в 8, 9, 6 и 4 (в таком порядке). При этом соответствующим образом модифицировать значения в K.
  6. Вывести число Q: сначала K[2] двоек, затем K[3] троек, K[4] четвёрок и т.д. до K[9].

3 комментария:

  1. Привет. Хотел спросить. А разве цифры c 0 по 9 не раскладываются как:
    0 = 1*0
    1 = 1*1
    2 = 1*2
    ...
    4 = 1*4 меньше чем 2*2
    6 = 1*6 меньше чем 2*3
    ...
    ?

    ОтветитьУдалить
  2. С разложением и преобразованием намудрил.

    Проще раскладывать циклом

    for(k=9; k>=2; k++) while (n%k==0) n/=k;

    если n==1 то ответ существует и чтоб его вывести достаточно отсортировать множители

    ОтветитьУдалить
  3. Забросил блог, а тут, оказывается, комментарии появились...)

    Sergey, (4 = 1*4) > (4 = 4), а требуется вывести минимальное допустимое число.

    Александр, да, Вы правы - циклом действительно проще (хотя в сущности выполняется то же самое)

    ОтветитьУдалить