fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <algorithm>
  5. #include <sstream>
  6. #include <cmath>
  7. #include <cassert>
  8. using namespace std;
  9.  
  10. struct Triple {
  11. unsigned int values[3];
  12. Triple(unsigned int newA, unsigned int newB, unsigned int newC)
  13. : values{newA, newB, newC} {}
  14. unsigned int a() const { return values[0]; }
  15. unsigned int b() const { return values[1]; }
  16. unsigned int c() const { return values[2]; }
  17. unsigned int sum() const { return accumulate(values, values + 3, 0); }
  18. bool operator<(const Triple& second) const {
  19. return lexicographical_compare(values, values + 3,
  20. second.values, second.values + 3);
  21. }
  22. };
  23.  
  24. Triple getTriple(unsigned int k, unsigned int m, unsigned int n) {
  25. assert(m > n);
  26. return {k*(m*m-n*n), k*2*m*n, k*(m*m + n*n)};
  27. }
  28.  
  29. set<unsigned int> factors(unsigned int n) {
  30. set<unsigned int> res;
  31. unsigned int root = sqrt(n);
  32. for(unsigned int i = 1; i <= root; i++) {
  33. if(n % i == 0) {
  34. res.insert(i);
  35. res.insert(n/i);
  36. }
  37. }
  38. return res;
  39. }
  40.  
  41. set<Triple> triangles(unsigned int sum) {
  42. auto factorSet = factors(sum);
  43. set<Triple> results;
  44. for(unsigned int k : factorSet)
  45. for(unsigned int m : factorSet) {
  46. unsigned int n = sum/(2*m*k) - m;
  47. if( !n || !((m - n) % 2) || (n >= m) || k*2*m*m >= sum)
  48. continue;
  49.  
  50. Triple triple = getTriple(k, m, n);
  51. if(triple.sum() == sum)
  52. results.insert(triple);
  53. }
  54. return results;
  55. }
  56.  
  57. int main(int argc, char** argv) {
  58. unsigned int amount;
  59. if(argc != 2) {
  60. cin >> amount;
  61. }
  62. else {
  63. stringstream ss(argv[1]);
  64. ss >> amount;
  65. }
  66. auto results = triangles(amount);
  67. for(auto& triple : results) {
  68. cout << triple.a() << " " << triple.b() << " " << triple.c() << "\n";
  69. }
  70. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty