给定三个正整数N , A和B,任务是检查是否有可能通过多次加或减A和B来获得N。
例子:
Input: N = 11, A = 2, B = 5
Output: YES
Explanation: 11 = 5 + 5 + 5 – 2 -2
Input: N = 11, A = 2, B = 4
Output: NO
Explanation: Not possible to obtain 11 from 2 and 4 only.
方法:
请按照以下步骤解决问题:
- 任务是检查是否可以多次加减A和B并获得N作为最终结果。
- 因此,就线性方程而言,可以写成:
Ax + By = N ,
其中x和y代表A和B相加或相减的次数。负x代表A减去x倍,负y代表B减去y倍 - 现在,目的是找到上述方程的积分解。在这里,使用扩展Euclid算法非常有效,该算法表示只有当N%gcd(a,b)为0时,解才存在。
下面是上述方法的实现:
C++
// C++ Program to check if
// a number can be obtained
// by repetitive addition
// or subtraction of two numbers
#include
using namespace std;
// Function to check and return if
// it is possible to obtain N by
// repetitive addition or subtraction
// of A and B
bool isPossible(int N, int a, int b)
{
// Calculate GCD of A and B
int g = __gcd(a, b);
// Condition to check
// if N can be obtained
if (N % g == 0)
return true;
else
return false;
}
// Driver Code
int main()
{
int N = 11, a = 2;
int b = 5;
if (isPossible(N, a, b))
cout << "YES";
else
cout << "NO";
}
Java
// Java program to check if
// a number can be obtained
// by repetitive addition
// or subtraction of two numbers
class GFG{
// Recursive function to return
// gcd of a and b
public static int gcd(int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
// Function to check and return if
// it is possible to obtain N by
// repetitive addition or subtraction
// of A and B
public static boolean isPossible(int N, int a,
int b)
{
// Calculate GCD of A and B
int g = gcd(a, b);
// Condition to check
// if N can be obtained
if (N % g == 0)
return true;
else
return false;
}
// Driver code
public static void main(String[] args)
{
int N = 11, a = 2;
int b = 5;
if (isPossible(N, a, b))
System.out.print("YES");
else
System.out.print("NO");
}
}
// This code is contributed by divyeshrabadiya07
Python3
# Python3 program to check if
# a number can be obtained
# by repetitive addition
# or subtraction of two numbers
# Recursive function to return
# gcd of a and b
def gcd(a, b):
if (b == 0):
return a
return gcd(b, a % b)
# Function to check and return if
# it is possible to obtain N by
# repetitive addition or subtraction
# of A and B
def isPossible(N, a, b):
# Calculate GCD of A and B
g = gcd(a, b)
# Condition to check
# if N can be obtained
if (N % g == 0):
return True
else:
return False
# Driver code
N = 11
a = 2
b = 5
if (isPossible(N, a, b) != False):
print("YES")
else:
print("NO")
# This code is contributed by code_hunt
C#
// C# program to check if
// a number can be obtained
// by repetitive addition
// or subtraction of two numbers
using System;
class GFG{
// Recursive function to return
// gcd of a and b
static int gcd(int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
// Function to check and return if
// it is possible to obtain N by
// repetitive addition or subtraction
// of A and B
static bool isPossible(int N, int a,
int b)
{
// Calculate GCD of A and B
int g = gcd(a, b);
// Condition to check
// if N can be obtained
if (N % g == 0)
return true;
else
return false;
}
// Driver code
public static void Main()
{
int N = 11, a = 2;
int b = 5;
if (isPossible(N, a, b))
Console.Write("YES");
else
Console.Write("NO");
}
}
// This code is contributed by chitranayal
Javascript
输出:
YES
时间复杂度: O(log(min(A,B))
辅助空间: O(1)