86 Cuboid Route

Problem 86

小蜘蛛从立方体的一点走最短距离爬到对顶点,爬过的长度可能是整数,比如立方体三维分别是 6,5,3,那么最短距离是 10,但也不总是整数。
对于三边最长是 的立方体,当 时,有 2060 个边长均为整数的不一样的立方体,其蜘蛛爬过的最短距离是整数,而 时,有 1975 个不同的立方体。
求满足上述条件的立方体个数超过一百万时 的最小值。

如果能够在不需要计算出具体满足题意的值的情况下,只通过计数得到结果,那么耗时将相当短。

不妨设三边和最大值满足关系 ,那么 ,最短路径的长度是 ,如果最短路径是整数,那么 可以在一定范围内变化。 最小也就是 的一半或者一半加一,最长的话就是等于 ,同时要满足 。所以很容易通过某个给定的 来得到满足条件的立方体个数。

int GetCountByA(int a)
{
    int count = 0;
    for (int bc = 2; bc <= 2 * a; bc++)
    {
        int slope = (int)Math.Sqrt(a * a + bc * bc);
        if (a * a + bc * bc == slope * slope)
        {
            int bStart = bc % 2 == 0 ? bc / 2 : bc / 2 + 1;
            int bEnd = Math.Min(a, bc - 1);
            count += bEnd - bStart + 1;
        }
    }

    return count;
}

,也就是 进行遍历,当总数大于一百万时停止,得到要求的

int count = 0;
int a = 2;
while (count < 1_000_000)
{
    a++;
    count += GetCountByA(a);
}