Python

Задача по программированию. Помогите пожалуйста)) Скидывайте, пожалуйста, на любых языках, я все пойму!

EM
Eleven Minutes
122
 n = int(input())
print(0 if n % 50 else (n // 200 + 1) * (n // 100 - n // 200 + 1))
Циклами - это скучно.
Если сумма не делится на 50 - ответ 0.

Всего существует n // 200 + 1 способ (от 0 до n // 200 купюр) использовать купюры по 200.
Для каждой суммы из k купюр по 200 существует (n - k * 200) // 100 + 1 == n // 100 - k * 2 + 1 способов использовать купюры по 100.
Остальное добивается купюрами по 50 без вариантов.

Итого у нас (n // 200 + 1) * (n // 100 + 1) минус арифметическая прогрессия из (n // 200 + 1) элементов со значениями от 0 до (n // 200) * 2, сумма которой равна: (n // 200 + 1) * (n // 200)
Юрий Журенко
Юрий Журенко
83 954
Лучший ответ
Eleven Minutes Спасибо большое!
Ну лови. Только ограничение в 1 секунду - это ну такое. Если ввести 100000, то за 1 секунду не получится (чтобы найти 250001 вариантов, понадобится ок. 20 секунд на весьма мощной машине):

 public static int CountPossibilities(int Remainder, int CurrentNominal) 
{
if (Remainder < 0)
return 0;
if (Remainder == 0)
return 1;
int[] Nominals = new int[] { 50, 100, 200 };
int cnt = 0;
foreach (int n in Nominals)
if (n >= CurrentNominal)
cnt += CountPossibilities(Remainder - n, n);
return cnt;
}

static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
Console.WriteLine(CountPossibilities(n, 0));

Console.ReadLine();
}
Eleven Minutes Благодарю!