fork(1) download
  1. #include <iostream>
  2. using namespace std;
  3. struct u64 {
  4. unsigned int lo;
  5. unsigned int hi;
  6. bool of;
  7. };
  8. u64 square(unsigned int a) {
  9. u64 result;
  10. unsigned int alo = (a & 0xffff);
  11. unsigned int ahi = (a >> 16);
  12. unsigned int aalo = alo * alo;
  13. unsigned int aami = alo * ahi;
  14. unsigned int aahi = ahi * ahi;
  15. unsigned int aa1 = aalo & 0xffff;
  16. unsigned int aa2 = (aalo >> 16) + (aami & 0xffff) + (aami & 0xffff);
  17. unsigned int aa3 = (aa2 >> 16) + (aami >> 16) + (aami >> 16) + (aahi & 0xffff);
  18. unsigned int aa4 = (aa3 >> 16) + (aahi >> 16);
  19. result.lo = (aa1 & 0xffff) | ((aa2 & 0xffff) << 16);
  20. result.hi = (aa3 & 0xffff) | (aa4 << 16);
  21. result.of = false;
  22. return result;
  23. }
  24. u64 sum(u64 a, u64 b) {
  25. u64 result;
  26. unsigned int a1 = a.lo & 0xffff;
  27. unsigned int a2 = a.lo >> 16;
  28. unsigned int a3 = a.hi & 0xffff;
  29. unsigned int a4 = a.hi >> 16;
  30. unsigned int b1 = b.lo & 0xffff;
  31. unsigned int b2 = b.lo >> 16;
  32. unsigned int b3 = b.hi & 0xffff;
  33. unsigned int b4 = b.hi >> 16;
  34. unsigned int s1 = a1 + b1;
  35. unsigned int s2 = a2 + b2 + (s1 >> 16);
  36. unsigned int s3 = a3 + b3 + (s2 >> 16);
  37. unsigned int s4 = a4 + b4 + (s3 >> 16);
  38. result.lo = (s1 & 0xffff) | ((s2 & 0xffff) << 16);
  39. result.hi = (s3 & 0xffff) | ((s4 & 0xffff) << 16);
  40. result.of = (s4 > 0xffff ? true : false);
  41. return result;
  42. }
  43. bool isTriple(unsigned int a, unsigned int b, unsigned int c) {
  44. u64 aa = square(a);
  45. u64 bb = square(b);
  46. u64 cc = square(c);
  47. u64 aabb = sum(aa, bb);
  48. return aabb.lo == cc.lo && aabb.hi == cc.hi && aabb.of == false;
  49. }
  50. int main() {
  51. cout << isTriple(3,4,5) << endl;
  52. cout << isTriple(2800,9600,10000) << endl;
  53. cout << isTriple(2800,9601,10000) << endl;
  54.  
  55. return 0;
  56. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
1
1
0