C/C++ 模方程解的个数程序?
在数学中,**模方程**是由*模*满足的代数方程,指的是模问题中的模。也就是说,给定模空间上的一些函数,模方程是在这些函数之间成立的方程,或者换句话说,是模的恒等式。
术语*模方程*最常见的用法是与椭圆曲线的模问题相关的。在这种情况下,模空间本身是一维的。这意味着模曲线函数域中的任意两个有理函数*F*和*G*都将满足模方程*P(F, G) = 0*,其中*P*是复数上两个变量的非零多项式。对于合适的非退化选择F和*G*,方程*P(X,Y) = 0*实际上将定义模曲线。
你刚刚看到了一种奇怪的数学表达式,形式为
B ≡ (A mod X)
这意味着B与A模X同余。让我们举个例子:
21 ≡ 5(mod 4)
符号≡表示“等价”。在上式中,21和5是等价的。这是因为21模4 = 1等于5模4 = 1。另一个例子是51 ≡ 16(mod 7)
在这个问题中,我们有两个整数a和b,我们必须找到满足模方程(A mod X)=B的可能的x值的数量,其中X是模方程的解。
例如
Input: A = 26, B = 2 Output: X can take 6 values
解释
X可以等于{3, 4, 6, 8, 12, 24}中的任何一个,因为A模这些值的任何一个都等于2,即**(26 mod 3) = (26 mod 4) = (26 mod 6) = (26 mod 8) = .... = 2**
我们有方程A mod X = B
条件
如果(A = B),则将有无限多个值,其中A始终大于X。
如果(A < B),则X不可能满足模方程。
现在只剩下最后一种情况(A > B)。
现在,在这种情况下,我们将使用关系
被除数 = 除数 * 商 + 余数
给定A(被除数)和B(余数),X即为除数。
现在
A = X * 商 + B
设商用Y表示
∴ A = X * Y + B
A - B = X * Y
∴为了得到Y的整数值,
我们需要取所有X,使得X整除(A - B)
∴ X是(A - B)的约数
找到(A – B)的约数是主要问题,而这些约数的个数就是X可以取的可能值。
我们知道A mod X解的值将是从(0到X – 1),取所有满足X > B的X。
这样我们可以得出结论,(A – B)的约数个数大于B,所有可能的X值都可以满足A mod X = B。
例子
#include <iostream> #include <math.h> using namespace std; int Divisors(int A, int B) { int N = (A - B); int D = 0; for (int i = 1; i <= sqrt(N); i++) { if ((N % i) == 0) { if (i > B) D++; if ((N / i) != i && (N / i) > B) D++; } } return D; } int PossibleWaysUtil(int A, int B) { if (A == B) return -1; if (A < B) return 0; int D = 0; D = Divisors(A, B); return D; } int main() { int A = 26, B = 2; int Sol = PossibleWaysUtil(A, B); if (Sol == -1) { cout <<" X can take Infinitely many values greater than " << A << "\n"; } else { cout << " X can take " << Sol << " values\n"; return 0; } }