Étant donné deux entiers à N chiffres X et Oui, la tâche consiste à minimiser produit de X et Oui en effectuant l’opération suivante un nombre quelconque de fois où l’on peut choisir un entier i tel que 1≤ je ≤ N et échange moie chiffres les plus bas de X et Y.
Exemples:
Saisir : N = 2, X = 13, Y = 22
Sortir: 276
Explication: En effectuant l’opération une fois, avec i = 1, nous obtenons X = 12 et Y = 23 (en échangeant les chiffres les plus à droite de X et Y). Maintenant X*Y serait 276. Il n’est pas possible de rendre X*Y inférieur à 276, d’où la réponse est 276.Saisir : N = 8, X = 20220122, Y = 21002300
Sortir: 54558365
Approche: L’idée pour résoudre le problème ci-dessus est:
Laisser unje et bje est-ce que jee chiffres les plus bas de X et Y.
X*Y = ∑∑ajebjdixje+j(les sommations vont de i = 0 à N – 1 et j = 0 à N – 1)
= ∑ ∑ajebjedix2i + ∑ ∑(unejebj+ unjbje)dixje+j
Notez que peu importe ce que ∑ ∑ajebjedix2i reste constant. Donc, nous devons minimiser ∑ ∑(ajebj + unjbje)dixje+j
Si unje – unj et Bje – bj avoir le même signe qu’unjebj + unjbje est plus petit, sinon unjebje + unjbj est plus petit. Ainsi, X*Y peut être minimisé en prenant le plus petit d’unje et Bje comme unje et plus grand que bje.
Les étapes suivantes peuvent être utilisées pour résoudre le problème :
- Par souci de simplicité, stockez X et Y dans des chaînes (disons x et y).
- Initialisez deux variables (disons newX et newY) qui stockent les valeurs mises à jour (après avoir effectué les permutations requises) de X et Y.
- Itérer sur tous les chiffres de x et y.
- Dans l’itération courante, si le chiffre courant de x est supérieur à celui de y, appliquez l’opération d’échange.
- Pendant l’itération, continuez à mettre à jour les valeurs de newX et newY.
- À la fin de l’itération, calculez le produit de newX et newY modulo 998244353 et renvoyez-le comme réponse.
Voici le code basé sur l’approche ci-dessus :
C++
// C++ code for the above approach #include <bits/stdc++.h> using namespace std; #define int long long const int MOD = 998244353; // Function to Minimize product of two // integers by swapping any number // of their digits int minProduct(int N, int X, int Y) { // Storing both integers in strings string x = to_string(X); string y = to_string(Y); // Initializing two variables to store // the updated values of X and Y such // that the product is minimized int newX = 0, newY = 0; // Iterating through all the // digits of x and y for (int i = 0; i < N; ++i) { // If current digit of x is greater // than that of y, we apply // the operation if (x[i] > y[i]) swap(x[i], y[i]); // Update the values of // newX and newY newX = (newX * 10 + (x[i] - '0')) % MOD; newY = (newY * 10 + (y[i] - '0')) % MOD; } // Compute the product of newX // and newY modulo MOD int ans = newX * newY % MOD; // Return the product return ans; } // Driver code int32_t main() { int N = 2, X = 13, Y = 22; // Function call int answer = minProduct(N, X, Y); cout << answer; return 0; }
Complexité temporelle : SUR)
Espace Auxiliaire : O(1)