aboutsummaryrefslogtreecommitdiff
path: root/week11/ex3.cpp
blob: bdcf937919cde50a8a32f6d4ee4681d007e5b307 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>

void ages(const int mult, const int sum, int youngest, int middle, int oldest, bool &foundSolution) {
	// Не проверяваме за сума, понеже винаги правим такива извиквания, че сумата да е коректна
	if (youngest * middle * oldest == mult) {
		std::cout << youngest << " " << middle << " " << oldest << std::endl;
		foundSolution = true;
		return;
	}

	// Правим middle по-стар като копенсираме чрез по-млад oldest
	if (!foundSolution && oldest - 1 > middle + 1)
		ages(mult, sum, youngest, middle + 1, oldest - 1, foundSolution);
	// Правим youngest по-стар, като middle трябва да има най-малко същата му възраст
	if (!foundSolution && sum - 2*(youngest + 1) > youngest + 1)
		ages(mult, sum, youngest + 1, youngest + 1, sum - 2*(youngest + 1), foundSolution);
}

void ages(const int mult, const int sum) {
	bool foundSolution = false;
	// Започваме с минималните възможни възрасти за youngest и middle
	ages(mult, sum, 1, 1, sum - 2, foundSolution);
}

int main() {
	int mult, sum;
	std::cin >> mult >> sum;

	ages(mult, sum);
}