243 Resilience

Problem 243

分子小于分母的分数被称为真分数。比如 ,那么有 11 个真分数 其中分子分母不能约分的分数称为最简分数,用 来表示最简分数的个数与 之比,比如 ,事实上, 是最小的整数满足 的。

求最小的 ,使得

一开始,我使用了暴力算法遍历 ,但是大约几十秒过去了, 都到了大几百万还是不满足题意。所以需要先推理简化问题再写程序。

个质因数,那么 可以写作 互斥且小于 的数的个数是 那么 因为前面我已经知道 很大,那么 。所以要先找到一些质数,使得 且再多一个质数就会不满足这个不等式。

要使得 最小化,那么这些质数就是从 2 开始的一些质数,然后 就是这些质数之积。当然,这个时候的 可能不满足题意,因为忽略了系数 ,但是 的若干倍(倍数小于下一个质数)就会满足题意的。

下面是实现代码,其中 要使用 long 的原因是 很小但乘积可能超过 int 的表示范围。

int[] primes = Utils.GenPrimes(50).Where(l => l != 0).Select(Convert.ToInt32).ToArray();
long c = 1;
long d = 1;
foreach (var p in primes)
{
    c *= p - 1;
    d *= p;
    if (c * 94744L < d * 15499L)
    {
        break;
    }
}

for (int i = 2; i <= primes.Last(); i++)
{
    long n = d * i;
    if (c * n * 94744L < d * (n - 1) * 15499L)
    {
        return n.ToString();
    }
}