Матч
390, Конкатенация числа (ConcatenateNumber)
Дивизион 2,
Уровень 2; Дивизион 1, Уровень 1
Задано натуральное число number. Необходимо найти наименьшее
количество копий number, объединение
которых дает число, делящееся на k. Если
искомого объединения копий number не
существует, вернуть -1.
Класс: ConcatenateNumber
Метод: int
getSmallest(int number, int k)
Ограничения: 1 £ number £ 109,
1 £ k £ 105.
Вход. Целые числа number и k.
Выход. Наименьшее количество копий number, объедининение которых дает число, делящееся на k. Если искомого объединения копий number не существует, вернуть -1.
Пример входа
number |
k |
2 |
9 |
121 |
11 |
35 |
98765 |
Пример выхода
9
1
9876
РЕШЕНИЕ
математика
Обозначим через di остаток от деления числа,
полученного конкатенацией i копий
числа number, на k. Тогда d0 = number
mod k, di+1
= (di * 10tens
+ number) mod k (tens – количество цифр числа number).
Наименьшее i, для которого di = 0, будет ответом. Если
требуемое i существует, то i £ k. Если среди i £ k ни одно из значений di
не равно 0, то искомой конкатенации копий числа number не существует, возвращаем -1.
Во избежание переполнения вычисления
следует проводить в 64 целочисленном типе данных long long.
ПРОГРАММА
#include <stdio.h>
class ConcatenateNumber
{
public:
int getSmallest(int
number, int k)
{
int i;
long long
n, tens = 1;
while(tens <= number) tens *= 10;
n = number %= k;
for(i = 1; i <= k; i++)
{
if (!n) return
i;
n = (n * tens + number) % k;
}
return -1;
}
};