方程解的个数

时间:2015-03-07 08:25:26

标签: c++ algorithm math

我有等式:x + y + xy = n。 我的代码:

#include <iostream>
#include <cstring>

using namespace std;

long c;

int main()
{
   long x = 0;
   cin >> c;
   if(c == 0)
   {
       cout << 1 << endl;
       return 0;
   }
   for(long i = 1; i <= c / 2; i ++)
   {
       for(long j = 1; j <= c; j ++)
           if(i + j + i * j == c)
           {
                       x ++;
                   break;
           }
   }
   cout << x + 2 << endl;
}

当然这段代码很慢。如何以更快的方式找到正数的解决方案?也许有特定的算法?

2 个答案:

答案 0 :(得分:1)

我们可以写:

x + y + xy = n
x + y(x + 1) = n
y = (n - x) / (x + 1)
  = (n + 1 - (x + 1)) / (x + 1)
  = (n + 1) / (x + 1) - (x + 1) / (x + 1)
  = (n + 1) / (x + 1) - 1

因此,您可以迭代x的所有值,并查看y的上述表达式中的哪一个产生整数结果(当n + 1可被x + 1整除时)

但是,我们不必迭代:这只会发生n + 1的除数。我们如何才能有效地找到n + 1

的除数

我们可以使用formula作为除数的数量:

n = p1^e1 * p2^e2 * ... , pi = prime numbers
=> divisor_count(n) = (e1 + 1)*(e2 + 1)*...

因此,您的算法可以替换为(未经测试,可能有一些错误):

divisors = 1
for i = 2 to sqrt(n):
  ei = 0
  while n % i == 0:
    n = n / i
    ei++

  divisors = divisors * (ei + 1)

  if n > 1:
    divisors = divisors * 2

即使是非常大的数字也应该足够快。但是,它仍然可以通过仅按质数检查可分性来改进,例如,可以使用Sieve of Eratosthenes生成素数。

答案 1 :(得分:0)

1 + x + y + x y = (1 + x)(1 + y) = n + 1

解的数量是n + 1的因子数,即多重性的乘积加上一个素因子。