357 Prime Generating Integers

Problem 357

30 能够分解得到的因数分别是 1,2,3,5,6,10,15,30

对于 30 的每一个因数 都是一个质数。

求不超过 100 000 000,且满足性质每一个因数 , 都是质数的 的和。

分析一下什么样的 满足上述性质。

能够分解成一系列的因数,记做 ,其中 ,也就是说只要分析前面一半,小于 的因数即可。

第一个因数肯定是 1,那么 是质数。所以先使用筛选法得到小于 100 000 000 的质数,然后都减去 1,得到的数才可能满足题意。

假如 能整除 4,也就是说 ,第二个因数是 2,且 , 是偶数,肯定不是质数,所以我们把能整除 4 的数排除。

同理, 也不能被 9 整除。但是剩余数能被 9 整除的也就只有几十万了,对于二百八十多万来说,差距不大,就没有用这条性质再过滤数据了。

long[] primes = Utils.GenPrimes(100000000);
var candidates = primes.Where(p => p != 0 && (p - 1) % 4 != 0)
    .Select(p => p - 1).ToArray();

现在,从剩余的 中看有多少是满足题意的。正如上面所分析的,只要分析前面一半,小于 的因数即可。

long result = 0;
foreach (int n in candidates)
{
    bool meet = true;
    int h = (int)Math.Sqrt(n);
    for (int i = 2; i <= h; i++)
    {
        if (n % i != 0)
        {
            continue;
        }

        int d = n / i;
        if (primes[d + i] == 0)
        {
            meet = false;
            break;
        }
    }

    if (meet)
    {
        result += n;
    }
}