Маленький Петя
любит целые числа. Недавно он изучил различные свойства сумм цифр числа.
Например, если сумма цифр числа делится на 9, то и само число делится на 9.
Сейчас
маленького Петю интересуют числа с одинаковой суммой цифр. Он просит старшего
брата Диму найти n натуральных чисел
с одинаковой суммой цифр и наименьшей возможной общей суммой. У Димы есть
другие дела, поэтому он попросил Вас написать программу, решающую эту задачу.
Вход. Содержит одно целое число n (1 ≤ n ≤
5000).
Выход. Вывести
наименьшую возможную сумму n
натуральных чисел, сумма цифр которых одинакова.
Пример
входа |
Пример
выхода |
2 |
11 |
перебор
Анализ алгоритма
Для каждого
числа i (1 ≤ i ≤ 106) посчитаем его
сумму цифр s. Построим список
смежности v, где v[s] содержит все натуральные
числа до 106 с суммой цифр s.
При этом все числа в массивах v[s]
остортируем по возрастанию.
Для нахождения
результата найдем суммы n наименьших
чисел из каждого v[s] (при этом нас
не интересуют такие v[s], которые
содержат меньше чем n чисел). Минимальная среди найденных сумм и будет искомой.
Реализация алгоритма
Объявим константу и список смежности v для хранения чисел.
#define MAX 1000010
vector<vector<int> > v;
Вычисляем сумму цифр числа n.
int sum(int
n)
{
int s = 0;
while(n >
0)
{
s += n % 10;
n /= 10;
}
return s;
}
Основная часть программы. Занесем в v[s] числа от 1 до 106 с суммой цифр s. В процессе построения списка смежности массивы v[s] уже являются отсортированными по возрастанию.
v.resize(MAX);
for(i = 1; i < MAX; i++)
{
s = sum(i);
v[s].push_back(i);
}
Читаем входное значение n.
Для каждого массива v[i], содержащего
хотя бы n чисел, находим сумму n наименьших чисел. Среди всех таких
сумм находим минимальную.
scanf("%d",&n);
res = (long long)1e18;
for(i = 1; i < MAX; i++)
if
(v[i].size() >= n)
res =
min(res,accumulate(v[i].begin(),v[i].begin()+n,0LL));
Выводим ответ.
printf("%lld\n",res);