Мы можем посчитать прямоугольные целочисленные треугольники с определенным периметром по std::map
, который имеет периметры в качестве ключей и количество треугольников в качестве значений:
std::map<int, int> triangle_map;
Далее, используя симметрию треугольниковобменивая a
и b
с переворотом, мы можем ограничить наш поиск поиска в случае a<=b
.Но если a==b
, то c=sqrt(2)*a
, который не является целым числом, тогда как a
является целым числом.Поэтому следующий двухконтурный поиск будет хорошо работать для нас и может найти все целевые треугольники:
const int Qmax_a = (Q-1)/2; // 1 is the minimum value of c.
for (int a = 1; a <= Qmax_a; ++a)
{
const int a_sqr = a*a;
for (int b = a+1; b <= Q-a-1; ++b)
{
const int two_side_sqr = a_sqr + b*b;
// possible candidate
const int c = static_cast<int>(std::round(std::sqrt(two_side_sqr)));
const int perimeter = (a+b+c);
if((c*c == two_side_sqr) && (P <= perimeter) && (perimeter <= Q)){
triangle_map[perimeter] += 1;
}
}
}
Наконец, мы можем получить желаемый результат из полученной карты:
ДЕМО
for(const auto& p : triangle_map){
std::cout << p.first << "," << p.second << std::endl;
}