Тесты проваливаются на степенях двойки (A=2^n) при n >= 5
Напишу два решения. Первое просто показывает алгоритм, но имеет ограничение на N (результат не может быть больше 15 из-за переполнения unsigned long long)
Второе по своей сути такое же, но не имеет ограничений. Однако для этого понадобится особый тип данных big_integer. Вторую реализацию прикрепил к ответу в виде текстового файла из-за ограничения на количество символов в ответе.
Тесты проваливаются на степенях двойки (A=2^n) при n >= 5
Напишу два решения. Первое просто показывает алгоритм, но имеет ограничение на N (результат не может быть больше 15 из-за переполнения unsigned long long)
Второе по своей сути такое же, но не имеет ограничений. Однако для этого понадобится особый тип данных big_integer. Вторую реализацию прикрепил к ответу в виде текстового файла из-за ограничения на количество символов в ответе.
// первое решение
#include <iostream>
typedef unsigned long long ulong;
ulong pow(int num, int pow);
int main()
{
int a = 0;
std::cin >> a;
int n = 0;
while (n++ <= a)
{
if (pow(n, n) % a == 0)
{
std::cout << n << std::endl;
break;
}
}
return 0;
}
ulong pow(int num, int pow)
{
ulong res = num;
for (int i = 1; i < pow; ++i)
res *= num;
return res;
}
ответ: 500
Объяснение:
1)Число точно больше 100, чтобы L было 3.
2)Какие бы числа мы не ставили на позициях единиц и десятков, результата они никакого не дадут, тк отрезаются командой div
3)Ближайшее необходимое число: 500
Дописал программу, чтобы проверить. Она выводит количество подходящих комбинаций при вводе всех чисел от 1 до 500.
var
x, L, M,count,i: integer;
begin
count:=0;
for i:=1 to 500 do
begin
x:=i; L := 0;M := 0;
while x > 0 do
begin
L := L + 1; x := x div 10;
if L mod 2 = 0 then
M := M + (x mod 10);
end;
//write(L,' ');write(M);
if (L=3) and (M=5) then inc(count);
end;
writeln(count);
end.