How to count the solutions of the equation \$x \cdot y + x \cdot z + y \cdot z = n, (0 \leq n \leq 10^4)\$ with the constraint that \$x \geq y \geq z \geq 0\$ ?
To solve this i've isolated the z value and brute-forced the values of x and y. If the values x,y,z satisfy the constraint and equation than its a valid solution.
#include <stdio.h>
int main () {
int x,y,z,n,counter;
while ( scanf("%d", &n), n != -1 ) {
counter = 0;
for ( x = n ; x >= 0; --x ) {
for ( y = x ; y > 0 ; --y ) {
z = (n - x*y);
//negative z isn't valid
if(z < 0)
continue;
z /= (x + y);
if( z <= y && y <= x && x*y + x*z + y*z == n ) {
++counter;
}
}
}
printf("%d\n",counter);
}
return 0;
}
The input contains several lines with one value for n. The program must stop when this value is -1.
The output is the number of solutions of the equation in separated lines.
Sample Input:
20 1 9747 -1
Sample Output:
5 1 57
How to make this code faster ?
z<0
you shouldbreak
\$\endgroup\$x
andy
are getting smaller, not larger, so the next pass through the loop should result in a largerz
, not a smaller one. \$\endgroup\$for ( y = x ; y > 0 ; --y ) {
befor ( y = x ; y >= 0 ; --y ) {
>=
vs>
as the condition was "x≥y≥z≥0"? \$\endgroup\$