110 Diophantine Reciprocals

110题链接

正整数方程 如果 ,那么有 113 个不同的解,这是不同解的数量超过 100 的最小的 值。

求不同解的数量超过四百万的 的最小值。

和 必须大于 ,否则 或 就比 大了。所以不妨令 ,其中 也都是整数。代入原式,我们可以得到 。所以原方程就变成了 有多少种方式分解成两数之积。

可以写作 可以写作 因数的个数是,那么解的个数就是因数个数加一除以二。

我们可以找到一个数,满足题意,但不一定最小。

假设 取值都是1,那么前十五个质数 乘积组成的 就有超过四百万个解,因为 。

能不能让这个数再小一点呢?

去掉尾部的一个质数,因数会小三倍,那么前面某个质数对应的 从1 到 4,那么指数从 3 到 9,刚好弥补三倍,2 的三次方是 8,3 的三次方是 27,比 43 和 47 小,所以可以去掉,然后 和 升到4。

上面我们推测的数对应的因子比四百万大很多,能不能去掉 41 呢?5 和 7 对应的 从 1 到 2,那么指数涨了 5/3 倍,两个数就是 25/9 倍,再除以三,是 25/27 倍,得到的因数还是远远大于四百万的。

综上,我们只需要前十二个质数即可。对应的 的取值分别是 。这些值的上限是多少呢?

17 对应的 值上限就是 1。如果是2 ,那么相比 1,因数个数增长了 5/3 倍,那么 2 从 4 到 6,3 从 4 到 5,增长 143/81,比 5/3 要大,但是其乘积是 12,比 17 小。17 之后的也上限也只能是1。

其他数字的上限怎么确定呢?我们用 5 做例子。假设对应的 最大是 5,那么考虑把它减到 2,因数少了 11/5 倍,我们增加一个质数比如 41,能增加三倍的因数,同时 41 比 125 小很多。所以 5 太宽松了,最大值取 4 即可。

经过一系列的分析,可以得出对应的最大值分别是 。

下面是代码,从取值为 0 开始,一直循环到最大值,然后看因数个数是否大于四百万,然后在所有满足题意的数字中选择最小的。

private readonly int MAX = 4_000_000;
private readonly int[] Primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37];
private readonly int[] MaxPower = [9, 5, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1];

private BigInteger min = long.MaxValue;

private void Check(int[] power, int index)
{
    if (index == power.Length)
    {
        int count = 1;
        foreach (var item in power)
        {
            count *= (1 + item * 2);
        }
        count++;
        count /= 2;

        if (count > MAX)
        {
            var n = Primes.Zip(power, (i, j) => (long)Math.Pow(i, j))
                .Select(l => (BigInteger)l).Aggregate(BigInteger.Multiply);
            if (n < min)
            {
                min = n;
            }
        }
    }
    else
    {
        for (int i = 0; i <= MaxPower[index]; i++)
        {
            var copy = power.ToArray();
            copy[index] = i;
            Check(copy, index + 1);
        }
    }
}
Check([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0);