#include <bits/stdc++.h>
using namespace std;
/*
Problem: Minimum Operations to Make a Cuboid's Volume Zero
You are given three integers:
- l = length
- b = breadth
- h = height
These represent the dimensions of a cuboid.
In one operation:
1. Compute g = gcd(l, b, h) using the current values
2. Choose exactly one among l, b, and h
3. Reduce that chosen dimension by g
You may repeat this operation as long as the dimensions stay non-negative.
Your task is to find the minimum number of operations needed to make
the volume of the cuboid equal to 0.
Since volume = l * b * h, the volume becomes 0 as soon as any one
of the three dimensions becomes 0.
------------------------------------------------------------
Example 1:
Input: l = 4, b = 6, h = 8
Step 1: gcd(4, 6, 8) = 2
Reduce l by 2 -> (2, 6, 8)
Step 2: gcd(2, 6, 8) = 2
Reduce l by 2 -> (0, 6, 8)
Now volume is 0, so answer = 2
------------------------------------------------------------
Example 2:
Input: l = 3, b = 3, h = 3
gcd(3, 3, 3) = 3
Reduce any one dimension by 3 -> one dimension becomes 0
So answer = 1
------------------------------------------------------------
Idea used here:
A useful trick is to normalize every state:
- divide all three values by their gcd
- sort them
Why does this help?
Because multiplying all three dimensions by the same factor does not
change the structure of future moves.
So normalized states are enough to represent the problem.
Then we do BFS:
- each state is one normalized triple (a, b, c)
- from that state, try decreasing one dimension by 1
(because after normalization, gcd becomes 1)
- normalize again
BFS guarantees the first time we reach a state with one dimension = 0,
it uses the minimum number of operations
------------------------------------------------------------
Important note:
This solution is exact, but it is practical only when the number of
reachable normalized states is manageable.
If the actual hidden constraints are very large, then this BFS approach
may be too slow and a more mathematical solution would be needed.
*/
struct State {
long long x, y, z;
bool operator== ( const State& other) const {
return x == other.x && y == other.y && z == other.z ;
}
} ;
struct StateHash {
size_t operator( ) ( const State& s) const {
size_t h1 = hash< long long > ( ) ( s.x ) ;
size_t h2 = hash< long long > ( ) ( s.y ) ;
size_t h3 = hash< long long > ( ) ( s.z ) ;
return h1 ^ ( h2 << 1 ) ^ ( h3 << 2 ) ;
}
} ;
/*
Normalize a state:
1. divide by gcd
2. sort the three values
This helps us avoid treating equivalent states as different.
*/
static State normalizeState( long long a, long long b, long long c) {
long long g = gcd( a, gcd( b, c) ) ;
if ( g > 1 ) {
a / = g;
b / = g;
c / = g;
}
array< long long , 3 > vals = { a, b, c} ;
sort( vals.begin ( ) , vals.end ( ) ) ;
return { vals[ 0 ] , vals[ 1 ] , vals[ 2 ] } ;
}
class Solution {
public :
int minimumOperations( long long l, long long b, long long h) {
State start = normalizeState( l, b, h) ;
queue< State> q;
unordered_map< State, int , StateHash> dist;
q.push ( start) ;
dist[ start] = 0 ;
while ( ! q.empty ( ) ) {
State cur = q.front ( ) ;
q.pop ( ) ;
int steps = dist[ cur] ;
// If any dimension becomes 0, volume becomes 0
if ( cur.x == 0 || cur.y == 0 || cur.z == 0 ) {
return steps;
}
/*
Since this state is already normalized,
gcd(cur.x, cur.y, cur.z) = 1.
So one move from here is equivalent to:
- decrease one dimension by 1
- normalize again
*/
long long dims[ 3 ] = { cur.x , cur.y , cur.z } ;
for ( int i = 0 ; i < 3 ; i++ ) {
if ( dims[ i] == 0 ) continue ;
long long nextDims[ 3 ] = { dims[ 0 ] , dims[ 1 ] , dims[ 2 ] } ;
nextDims[ i] -- ;
State nextState = normalizeState(
nextDims[ 0 ] ,
nextDims[ 1 ] ,
nextDims[ 2 ]
) ;
if ( ! dist.count ( nextState) ) {
dist[ nextState] = steps + 1 ;
q.push ( nextState) ;
}
}
}
return - 1 ;
}
} ;
int main( ) {
Solution sol;
cout << sol.minimumOperations ( 4 , 6 , 8 ) << '\n ' ; // 2
cout << sol.minimumOperations ( 3 , 3 , 3 ) << '\n ' ; // 1
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovKgpQcm9ibGVtOiBNaW5pbXVtIE9wZXJhdGlvbnMgdG8gTWFrZSBhIEN1Ym9pZCdzIFZvbHVtZSBaZXJvCgpZb3UgYXJlIGdpdmVuIHRocmVlIGludGVnZXJzOgotIGwgPSBsZW5ndGgKLSBiID0gYnJlYWR0aAotIGggPSBoZWlnaHQKClRoZXNlIHJlcHJlc2VudCB0aGUgZGltZW5zaW9ucyBvZiBhIGN1Ym9pZC4KCkluIG9uZSBvcGVyYXRpb246CjEuIENvbXB1dGUgZyA9IGdjZChsLCBiLCBoKSB1c2luZyB0aGUgY3VycmVudCB2YWx1ZXMKMi4gQ2hvb3NlIGV4YWN0bHkgb25lIGFtb25nIGwsIGIsIGFuZCBoCjMuIFJlZHVjZSB0aGF0IGNob3NlbiBkaW1lbnNpb24gYnkgZwoKWW91IG1heSByZXBlYXQgdGhpcyBvcGVyYXRpb24gYXMgbG9uZyBhcyB0aGUgZGltZW5zaW9ucyBzdGF5IG5vbi1uZWdhdGl2ZS4KCllvdXIgdGFzayBpcyB0byBmaW5kIHRoZSBtaW5pbXVtIG51bWJlciBvZiBvcGVyYXRpb25zIG5lZWRlZCB0byBtYWtlCnRoZSB2b2x1bWUgb2YgdGhlIGN1Ym9pZCBlcXVhbCB0byAwLgoKU2luY2Ugdm9sdW1lID0gbCAqIGIgKiBoLCB0aGUgdm9sdW1lIGJlY29tZXMgMCBhcyBzb29uIGFzIGFueSBvbmUKb2YgdGhlIHRocmVlIGRpbWVuc2lvbnMgYmVjb21lcyAwLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpFeGFtcGxlIDE6CklucHV0OiBsID0gNCwgYiA9IDYsIGggPSA4CgpTdGVwIDE6IGdjZCg0LCA2LCA4KSA9IDIKUmVkdWNlIGwgYnkgMiAtPiAoMiwgNiwgOCkKClN0ZXAgMjogZ2NkKDIsIDYsIDgpID0gMgpSZWR1Y2UgbCBieSAyIC0+ICgwLCA2LCA4KQoKTm93IHZvbHVtZSBpcyAwLCBzbyBhbnN3ZXIgPSAyCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkV4YW1wbGUgMjoKSW5wdXQ6IGwgPSAzLCBiID0gMywgaCA9IDMKCmdjZCgzLCAzLCAzKSA9IDMKUmVkdWNlIGFueSBvbmUgZGltZW5zaW9uIGJ5IDMgLT4gb25lIGRpbWVuc2lvbiBiZWNvbWVzIDAKClNvIGFuc3dlciA9IDEKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSWRlYSB1c2VkIGhlcmU6CgpBIHVzZWZ1bCB0cmljayBpcyB0byBub3JtYWxpemUgZXZlcnkgc3RhdGU6Ci0gZGl2aWRlIGFsbCB0aHJlZSB2YWx1ZXMgYnkgdGhlaXIgZ2NkCi0gc29ydCB0aGVtCgpXaHkgZG9lcyB0aGlzIGhlbHA/CkJlY2F1c2UgbXVsdGlwbHlpbmcgYWxsIHRocmVlIGRpbWVuc2lvbnMgYnkgdGhlIHNhbWUgZmFjdG9yIGRvZXMgbm90CmNoYW5nZSB0aGUgc3RydWN0dXJlIG9mIGZ1dHVyZSBtb3Zlcy4KClNvIG5vcm1hbGl6ZWQgc3RhdGVzIGFyZSBlbm91Z2ggdG8gcmVwcmVzZW50IHRoZSBwcm9ibGVtLgoKVGhlbiB3ZSBkbyBCRlM6Ci0gZWFjaCBzdGF0ZSBpcyBvbmUgbm9ybWFsaXplZCB0cmlwbGUgKGEsIGIsIGMpCi0gZnJvbSB0aGF0IHN0YXRlLCB0cnkgZGVjcmVhc2luZyBvbmUgZGltZW5zaW9uIGJ5IDEKICAoYmVjYXVzZSBhZnRlciBub3JtYWxpemF0aW9uLCBnY2QgYmVjb21lcyAxKQotIG5vcm1hbGl6ZSBhZ2FpbgoKQkZTIGd1YXJhbnRlZXMgdGhlIGZpcnN0IHRpbWUgd2UgcmVhY2ggYSBzdGF0ZSB3aXRoIG9uZSBkaW1lbnNpb24gPSAwLAppdCB1c2VzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBvcGVyYXRpb25zCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkltcG9ydGFudCBub3RlOgpUaGlzIHNvbHV0aW9uIGlzIGV4YWN0LCBidXQgaXQgaXMgcHJhY3RpY2FsIG9ubHkgd2hlbiB0aGUgbnVtYmVyIG9mCnJlYWNoYWJsZSBub3JtYWxpemVkIHN0YXRlcyBpcyBtYW5hZ2VhYmxlLgoKSWYgdGhlIGFjdHVhbCBoaWRkZW4gY29uc3RyYWludHMgYXJlIHZlcnkgbGFyZ2UsIHRoZW4gdGhpcyBCRlMgYXBwcm9hY2gKbWF5IGJlIHRvbyBzbG93IGFuZCBhIG1vcmUgbWF0aGVtYXRpY2FsIHNvbHV0aW9uIHdvdWxkIGJlIG5lZWRlZC4KKi8KCnN0cnVjdCBTdGF0ZSB7CiAgICBsb25nIGxvbmcgeCwgeSwgejsKCiAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RhdGUmIG90aGVyKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHggPT0gb3RoZXIueCAmJiB5ID09IG90aGVyLnkgJiYgeiA9PSBvdGhlci56OwogICAgfQp9OwoKc3RydWN0IFN0YXRlSGFzaCB7CiAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBTdGF0ZSYgcykgY29uc3QgewogICAgICAgIHNpemVfdCBoMSA9IGhhc2g8bG9uZyBsb25nPigpKHMueCk7CiAgICAgICAgc2l6ZV90IGgyID0gaGFzaDxsb25nIGxvbmc+KCkocy55KTsKICAgICAgICBzaXplX3QgaDMgPSBoYXNoPGxvbmcgbG9uZz4oKShzLnopOwogICAgICAgIHJldHVybiBoMSBeIChoMiA8PCAxKSBeIChoMyA8PCAyKTsKICAgIH0KfTsKCi8qCk5vcm1hbGl6ZSBhIHN0YXRlOgoxLiBkaXZpZGUgYnkgZ2NkCjIuIHNvcnQgdGhlIHRocmVlIHZhbHVlcwoKVGhpcyBoZWxwcyB1cyBhdm9pZCB0cmVhdGluZyBlcXVpdmFsZW50IHN0YXRlcyBhcyBkaWZmZXJlbnQuCiovCnN0YXRpYyBTdGF0ZSBub3JtYWxpemVTdGF0ZShsb25nIGxvbmcgYSwgbG9uZyBsb25nIGIsIGxvbmcgbG9uZyBjKSB7CiAgICBsb25nIGxvbmcgZyA9IGdjZChhLCBnY2QoYiwgYykpOwoKICAgIGlmIChnID4gMSkgewogICAgICAgIGEgLz0gZzsKICAgICAgICBiIC89IGc7CiAgICAgICAgYyAvPSBnOwogICAgfQoKICAgIGFycmF5PGxvbmcgbG9uZywgMz4gdmFscyA9IHthLCBiLCBjfTsKICAgIHNvcnQodmFscy5iZWdpbigpLCB2YWxzLmVuZCgpKTsKCiAgICByZXR1cm4ge3ZhbHNbMF0sIHZhbHNbMV0sIHZhbHNbMl19Owp9CgpjbGFzcyBTb2x1dGlvbiB7CnB1YmxpYzoKICAgIGludCBtaW5pbXVtT3BlcmF0aW9ucyhsb25nIGxvbmcgbCwgbG9uZyBsb25nIGIsIGxvbmcgbG9uZyBoKSB7CiAgICAgICAgU3RhdGUgc3RhcnQgPSBub3JtYWxpemVTdGF0ZShsLCBiLCBoKTsKCiAgICAgICAgcXVldWU8U3RhdGU+IHE7CiAgICAgICAgdW5vcmRlcmVkX21hcDxTdGF0ZSwgaW50LCBTdGF0ZUhhc2g+IGRpc3Q7CgogICAgICAgIHEucHVzaChzdGFydCk7CiAgICAgICAgZGlzdFtzdGFydF0gPSAwOwoKICAgICAgICB3aGlsZSAoIXEuZW1wdHkoKSkgewogICAgICAgICAgICBTdGF0ZSBjdXIgPSBxLmZyb250KCk7CiAgICAgICAgICAgIHEucG9wKCk7CgogICAgICAgICAgICBpbnQgc3RlcHMgPSBkaXN0W2N1cl07CgogICAgICAgICAgICAvLyBJZiBhbnkgZGltZW5zaW9uIGJlY29tZXMgMCwgdm9sdW1lIGJlY29tZXMgMAogICAgICAgICAgICBpZiAoY3VyLnggPT0gMCB8fCBjdXIueSA9PSAwIHx8IGN1ci56ID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdGVwczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgU2luY2UgdGhpcyBzdGF0ZSBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQsCiAgICAgICAgICAgIGdjZChjdXIueCwgY3VyLnksIGN1ci56KSA9IDEuCgogICAgICAgICAgICBTbyBvbmUgbW92ZSBmcm9tIGhlcmUgaXMgZXF1aXZhbGVudCB0bzoKICAgICAgICAgICAgLSBkZWNyZWFzZSBvbmUgZGltZW5zaW9uIGJ5IDEKICAgICAgICAgICAgLSBub3JtYWxpemUgYWdhaW4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgbG9uZyBsb25nIGRpbXNbM10gPSB7Y3VyLngsIGN1ci55LCBjdXIuen07CgogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGRpbXNbaV0gPT0gMCkgY29udGludWU7CgogICAgICAgICAgICAgICAgbG9uZyBsb25nIG5leHREaW1zWzNdID0ge2RpbXNbMF0sIGRpbXNbMV0sIGRpbXNbMl19OwogICAgICAgICAgICAgICAgbmV4dERpbXNbaV0tLTsKCiAgICAgICAgICAgICAgICBTdGF0ZSBuZXh0U3RhdGUgPSBub3JtYWxpemVTdGF0ZSgKICAgICAgICAgICAgICAgICAgICBuZXh0RGltc1swXSwKICAgICAgICAgICAgICAgICAgICBuZXh0RGltc1sxXSwKICAgICAgICAgICAgICAgICAgICBuZXh0RGltc1syXQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoIWRpc3QuY291bnQobmV4dFN0YXRlKSkgewogICAgICAgICAgICAgICAgICAgIGRpc3RbbmV4dFN0YXRlXSA9IHN0ZXBzICsgMTsKICAgICAgICAgICAgICAgICAgICBxLnB1c2gobmV4dFN0YXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBTb2x1dGlvbiBzb2w7CgogICAgY291dCA8PCBzb2wubWluaW11bU9wZXJhdGlvbnMoNCwgNiwgOCkgPDwgJ1xuJzsgLy8gMgogICAgY291dCA8PCBzb2wubWluaW11bU9wZXJhdGlvbnMoMywgMywgMykgPDwgJ1xuJzsgLy8gMQoKICAgIHJldHVybiAwOwp9