Pythagoras triplet

why the code is not showing any output although it compiled succesfully.

hello @lovely

check ur loop conditions they are not correct.

also u dont have to use loop for answer , u can get it in o(1) per input.

here is the approach->
If m>n>0 are integers, then (m2-n2, 2mn, m2-n2) is a Pythagorean triple. This is easily seen with a bit of algebra. Thus, plugging in various (m,n) will give various triples.
Now, our goal is to find a triple of the form (m2-n2, 2mn, m2-n2) in which our input value is one of the catheti. Note that the catheti are m2-n2 and 2mn. Also, note that the second cathetus is always even. Thus, it makes sense to consider two cases:

  • If a is even, then let’s try to equate it with the second cathetus, 2mn, i.e., let’s try to find an (m,n) pair such that 2mn = a. In this case, is even, so we can divide by 2. We have mn = a/2. Thus, all we have to do is to find a factorization of a/2 into mn such that m>n. You can try various factoring methods — even naïve O(√a) time method will pass - but in this case , we don’t really even need to do that, since the trivial (m,n) = (a/2,1) works!. This gives us the solution triple ( (a^2)/4 - 1, a, (a^2)/4 + 1 ). Note that (a^2)/4 is an integer since a is even.
  • If a is odd, then we can’t equate it with the second cathetus, so let’s try instead m2-n2, i.e. we want to find an (m,n) such that m2-n2 = a. Node that m2-n2 = (m+n)(m-n), so all boils down again to factoring! Let’s try our trivial factorization again: (m+n, m-n) = (a,1) What we get is a system of two linear equations: m+n=a and m-n=1 which has solution m=(a+1)/2 and n=(a-1)/2. Substituting back, this gives us the triple (a, (a^2 - 1)/2, (a^2 + 1)/2). Note that (a^2 + 1)/2 is an integer as a is odd.

code->

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
#define ll long long int
int main(){
    ll x;

    while( cin >> x){
        if(x < 3){ printf("-1\n");  continue; }

        if(x & 1)  printf("%lld %lld", (x*x-1)/2, (x*x+1)/2);
        else{

            printf("%lld %lld", ((x*x)/4)-1, ((x*x)/4)+1);
        }
    }
    return 0;
}

i could not understand this code.can u please tell some other method to solve

check now , this should make sense->

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
#define ll long long int
int main(){
    ll x;

    while( cin >> x){  // we r using this loop becuse we need to process unknown number of input

        if(x < 3){  cout<<"-1\n";  continue; }

        if(x %2 !=0)   cout<<(x*x-1)/2<<" "<<(x*x+1)/2;
        else{

             cout<<((x*x)/4)-1<<" "<< ((x*x)/4)+1;
        }
    }
    return 0;
}
1 Like

while( cin >> x) can we use while(1) instead of this and then inside the while loop cin>>x and updating x by x++?

no

we cannot, why x++ ? x is data only doing x++ will not help.

while(cin>>x) this will stop when no input is left . there is no other way to guess where to stop

but how will we guess it that we have to use this :thinking:

whenever u are required to read unknown number of integers u can use it .

1 Like

I hope I’ve cleared your doubt. I ask you to please rate your experience here
Your feedback is very important. It helps us improve our platform and hence provide you
the learning experience you deserve.

On the off chance, you still have some questions or not find the answers satisfactory, you may reopen
the doubt.