243 Resilience
分子小于分母的分数被称为真分数。比如 ,那么有 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();
}
}