# Reduce N to 0 or less by given X and Y operations

Given three integers **N**, **X, **and **Y, **the task is to check if it is possible to reduce **N** to 0 or less by the following operations:

- Update
**N**to**âŒŠN/2âŒ‹ + 10,**at most**X**times - Update
**N**to**N – 10,**at most**Y**times.

**Example:**

Input:N = 100, X = 3, Y = 4Output:YesExplanation:

Update N = 100 to âŒŠ100/2âŒ‹ + 10 = 60.

Update N = 60 to 60 âˆ’ 10 = 50.

Update N = 50 to âŒŠ50/2âŒ‹ + 10 = 35.

Update N = 35 to âŒŠ35/2âŒ‹ + 10 = 27.

Update N = 27 to 27 âˆ’ 10 = 17.

Update N = 17 to 17 âˆ’ 10 = 7.

Update N = 7 to 7 âˆ’ 10 = âˆ’3.

Input:N = 50, X = 1, Y = 2Output:No

**Approach:** This problem can be solved based on the following observations:

**Case 1:**If**âŒŠN/2âŒ‹ + 10 >= N**, then perform only second operation as the first operation will increase the value**N**.**Case 2:**If first operation is performed followed by the second operation then the result is:

Operation 1: N = âŒŠN/2âŒ‹ + 10

Operation 2: (âŒŠN/2âŒ‹ + 10) – 10 = âŒŠN/2âŒ‹

- The value of
**N**is reduced to**(âŒŠN/2âŒ‹)**. **Case 3:**If second operation is performed followed by the first operation then the result is:

Operation 2: N = N – 10

Operation 1: âŒŠ(N – 10)/2âŒ‹ + 10 = (âŒŠN/2âŒ‹ – 5 + 10) = (âŒŠN/2âŒ‹ + 5)

- The value of
**N**is reduced to**(âŒŠN/2âŒ‹ + 5)**.

From the above two observations, if **N > N/2 +10**, then it can be concluded that, to reduce the value of **N** to** 0** or less, the first operation must be performed before the second operation to decrease the value of **N**.

Follow the steps below to solve the problem:

- Update the value of
**N**to**âŒŠN/2âŒ‹ + 10**if N > N/2 + 10 and X > 0. - Update the value of
**N**to**N â€“ 10**at most Y times. - Check if the updated value of
**N**is less than equal to 0 or not. - If N â‰¤ 0, then print
**“Yes”**. Otherwise, print**“No”**.

Below is the implementation of the above approach:

## C++

`// C++ Program to implement` `// the above approach` `#include <bits/stdc++.h>` `using` `namespace` `std;` `// Function to check if N can be` `// reduced to <= 0 or not` `bool` `NegEqu(` `int` `N, ` `int` `X, ` `int` `Y)` `{` ` ` `// Update N to N/2 + 10 at most X times` ` ` `while` `(X-- and N > N/2 + 10) {` ` ` `N = N / 2 + 10;` ` ` `}` ` ` `// Update N to N - 10 Y times` ` ` `while` `(Y--) {` ` ` `N = N - 10;` ` ` `}` ` ` `if` `(N <= 0)` ` ` `return` `true` `;` ` ` `return` `false` `;` `}` `// Driver Code` `int` `main()` `{` ` ` `int` `N = 100;` ` ` `int` `X = 3;` ` ` `int` `Y = 4;` ` ` `if` `(NegEqu(N, X, Y)) {` ` ` `cout << ` `"Yes"` `;` ` ` `}` ` ` `else` `{` ` ` `cout << ` `"No"` `;` ` ` `}` `}` |

## Java

`// Java program to implement` `// the above approach` `class` `GFG{` `// Function to check if N can be` `// reduced to <= 0 or not` `static` `boolean` `NegEqu(` `int` `N, ` `int` `X, ` `int` `Y)` `{` ` ` ` ` `// Update N to N/2 + 10 at most X times` ` ` `while` `(X > ` `0` `&& (N > N / ` `2` `+ ` `10` `))` ` ` `{` ` ` `N = N / ` `2` `+ ` `10` `;` ` ` `X -= ` `1` `;` ` ` `}` ` ` `// Update N to N - 10 Y times` ` ` `while` `(Y > ` `0` `)` ` ` `{` ` ` `N = N - ` `10` `;` ` ` `Y -= ` `1` `;` ` ` `}` ` ` `if` `(N <= ` `0` `)` ` ` `return` `true` `;` ` ` `return` `false` `;` `}` `// Driver Code` `public` `static` `void` `main(String[] args)` `{` ` ` `int` `N = ` `100` `;` ` ` `int` `X = ` `3` `;` ` ` `int` `Y = ` `4` `;` ` ` `if` `(NegEqu(N, X, Y))` ` ` `{` ` ` `System.out.println(` `"Yes"` `);` ` ` `}` ` ` `else` ` ` `{` ` ` `System.out.println(` `"No"` `);` ` ` `}` `}` `}` `// This code is contributed by jana_sayantan` |

## Python3

`# Python3 program to implement` `# the above approach` `# Function to check if N can be` `# reduced to <= 0 or not` `def` `NegEqu(N, X, Y):` ` ` `# Update N to N/2 + 10 at most X times` ` ` `while` `(X ` `and` `N > N ` `/` `/` `2` `+` `10` `):` ` ` `N ` `=` `N ` `/` `/` `2` `+` `10` ` ` `X ` `-` `=` `1` ` ` `# Update N to N - 10 Y times` ` ` `while` `(Y):` ` ` `N ` `=` `N ` `-` `10` ` ` `Y ` `-` `=` `1` ` ` `if` `(N <` `=` `0` `):` ` ` `return` `True` ` ` `return` `False` `# Driver Code` `if` `__name__ ` `=` `=` `'__main__'` `:` ` ` ` ` `N ` `=` `100` ` ` `X ` `=` `3` ` ` `Y ` `=` `4` ` ` `if` `(NegEqu(N, X, Y)):` ` ` `print` `(` `"Yes"` `)` ` ` `else` `:` ` ` `print` `(` `"No"` `)` `# This code is contributed by mohit kumar 29` |

## C#

`// C# program to implement` `// the above approach` `using` `System;` `class` `GFG{` `// Function to check if N can be` `// reduced to <= 0 or not` `public` `static` `bool` `NegEqu(` `int` `N, ` `int` `X,` ` ` `int` `Y)` `{` ` ` ` ` `// Update N to N/2 + 10 at most X times` ` ` `while` `(X > 0 && (N > N / 2 + 10))` ` ` `{` ` ` `N = N / 2 + 10;` ` ` `X -= 1;` ` ` `}` ` ` `// Update N to N - 10 Y times` ` ` `while` `(Y > 0)` ` ` `{` ` ` `N = N - 10;` ` ` `Y -= 1;` ` ` `}` ` ` `if` `(N <= 0)` ` ` `return` `true` `;` ` ` `return` `false` `;` `}` ` ` `// Driver Code` `public` `static` `void` `Main(String[] args)` `{` ` ` `int` `N = 100;` ` ` `int` `X = 3;` ` ` `int` `Y = 4;` ` ` `if` `(NegEqu(N, X, Y))` ` ` `{` ` ` `Console.WriteLine(` `"Yes"` `);` ` ` `}` ` ` `else` ` ` `{` ` ` `Console.WriteLine(` `"No"` `);` ` ` `}` `}` `}` `// This code is contributed by jana_sayantan` |

## Javascript

`<script>` `// JavaScript implementation of the above approach` `// Function to check if N can be` `// reduced to <= 0 or not` `function` `NegEqu(N, X, Y)` `{` ` ` ` ` `// Update N to N/2 + 10 at most X times` ` ` `while` `(X > 0 && (N > N / 2 + 10))` ` ` `{` ` ` `N = N / 2 + 10;` ` ` `X -= 1;` ` ` `}` ` ` ` ` `// Update N to N - 10 Y times` ` ` `while` `(Y > 0)` ` ` `{` ` ` `N = N - 10;` ` ` `Y -= 1;` ` ` `}` ` ` ` ` `if` `(N <= 0)` ` ` `return` `true` `;` ` ` ` ` `return` `false` `;` `}` `// Driver code` ` ` ` ` `let N = 100;` ` ` `let X = 3;` ` ` `let Y = 4;` ` ` ` ` `if` `(NegEqu(N, X, Y))` ` ` `{` ` ` `document.write(` `"Yes"` `);` ` ` `}` ` ` `else` ` ` `{` ` ` `document.write(` `"No"` `);` ` ` `}` ` ` ` ` `// This code is contributed by code_hunt.` `</script>` |

**Output:**

Yes

** Time Complexity: **O(X + Y)

**Auxiliary Space**:O(1)