ВУЗы и колледжи

Решите олимпиадную задачу пж!

Написать программу на пайтоне: вводится периметр треугольника n (целое, 0<n<10^9) Вывести сколько прямоугольных (с целыми сторонами) треугольников существует с данным периметром вывести стороны этих треугольников в лексиграфическом порядке
Ввод:
120
Вывод:
3
20 48 52
24 45 51
30 40 50
Ввод:
12
Вывод:
1
3 4 5
А PascalABC подойдет?


var p, Col : integer;
begin
Col := 0;
Write (' Введите периметр треугольника p = ') ; ReadLn (p);
for var i := 1 to p do
for var j := i to p do
for var k := j to p do
begin
If (i + j + k = p) and (sqr(i) + sqr(j)=sqr(k)) then
begin
WriteLn (i:5, j:5, k:5); Col := Col + 1;
end;
end;
Write (' Количество треугольников равно ', Col);
end.
Artur Baghdasaryan
Artur Baghdasaryan
73 229
Лучший ответ
Подсчитайте количество возможных прямоугольных треугольников с заданным периметром
Автор
Суджандутта
Читать
Обсудить
Курсы
Практика

Учитывая периметр P, задача состоит в том, чтобы найти количество возможных прямоугольных треугольников с периметром, равным p.
Примеры:


Input: P = 12
Output: number of right triangles = 1
The only right angle possible is with sides
hypotenuse = 5, perpendicular = 4 and base = 3.

Input: p = 840
Output: number of right triangles = 8


Рекомендуется: Пожалуйста, сначала попробуйте свой подход на {IDE}, прежде чем переходить к решению.
Итак, цель состоит в том, чтобы найти количество решений, которые удовлетворяют уравнениям a + b + c = p и a 2 + b 2 = c 2.
Наивный подход состоит в том, чтобы выполнить два цикла для a (от 1 до p / 2) и b (от a + 1 до p / 3), затем сделать c = p-a-b и увеличить количество на единицу, если a * a + b * b == c * c . Это займет O(p^{2}) время.
Эффективный подход можно найти с помощью небольших алгебраических манипуляций :


a ^{2}+ b ^{2}= c ^{2} или, (a + b) ^{2}-2ab = c ^{2} или, (p-c) ^{2}-2ab = c^{2} или, p ^{2}-2cp-2ab = 0 или, 2ab = p ^{2}-2cp или, 2ab = p ^{2}-2p (p-a-b) или, 2a (p-b) = p(p-2b) или, a = (p/2) * ((p-2b)/(p-b))
Ksusha Grasmik
Ksusha Grasmik
63 473
С двойным циклом:
 n, k, T = int(input()), 0, [] 
for a in range(1, n + 1):
na, aa = n - a, a * a
for b in range(a, n + 1):
c = na - b
if c