查找满足不等式的正整数对的数量

时间:2018-12-04 19:35:09

标签: c++ geometry inequality

我正在尝试解决一个编程问题,其中我必须显示不等式x² + y² < n的正整数解的数量,其中n由用户给出。我已经写了一段代码,该代码似乎可以运行,但速度却不如我所愿。有什么办法可以加快速度吗? 我当前的代码:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    long long n, i, r, k, p, a;
    cin >> k;
    while (k--)
    {
        r = 0;
        cin >> n;
        p = sqrt(n);
        for (i = 1; i <= p; i++)
        {
            a = sqrt(n - (i * i));
            r += a;
            if ((((i * i) + (a * a)) == n) && (a > 0))
            {
                r--;
            }
        }
        cout << r << "\n";
    }
    return 0;
}

编辑:

这是this task的解决方案。

英语任务:
找到不等式(x≥1, y≥1)的自然解x²+y² < n的数量,其中0 < n < 2147483647。例如,对于n=10,有4个解决方案:(1,1), (1,2), (2,1), (2,2)

输入
在输入的第一行中,给出了测试用例的数量k。在接下来的k行中,提供了n值。

输出
在输出中,必须在单独的行中显示不等式的自然解的数量。

示例

输入:

2
10
11

输出:

4
6

1 个答案:

答案 0 :(得分:1)

您的解决方案似乎已经很快。减少花费时间的主要可能性是在循环中禁止调用sqrt。这是通过考虑值a = sqrt(n - (i * i))从一次迭代到下一次迭代变化不大而获得的。

这是代码:

    r = 0;
    p = sqrt(n);
    if ((p*p) == n) p--;
    a = p;
    for (long long i = 1; i <= p; i++)
    {
        while ((n-i*i) <= a*a) {
            --a;
        }
        r += a;
    }