我有等式: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;
}
当然这段代码很慢。如何以更快的方式找到正数的解决方案?也许有特定的算法?
答案 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
的因子数,即多重性的乘积加上一个素因子。