公式ウェブサイトによって与えられた解決策
一般的な意味
aには少なくとも4つの因子があり、aの因子の任意のペア間の差はd以上です。最小のものを見つける
数aを見つけた因子を分析します。まず、1がその因子である必要があります。aの任意の2つの因子間の差がd以上であることを確認する必要があります。2つの隣接する因子mが見つかったとします。 nはd以上の差を満たしますが、mまたはnもより小さな因子に分解できる場合、条件を満たさないサブ因子に差がある可能性があるため、素因数を要求する必要があります。素数ふるいを使用して素数をprimes []に格納し、次に、条件を満たすために配列内の素因数を見つけます。
C ++コード
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
const int N = 1e7+5;
int primes[N], cnt; // primes[]存储所有素数
bool st[N]; // st[x]存储x是否被筛掉
void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] <= n / i; j ++ )
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
bool check(int n)
{
for (int i=0; primes[i]*primes[i]<=n; i++)
if (n%primes[i]==0)
return false;
return true;
}
long long ans[100005];
int main()
{
get_primes(1e6);
int t;
cin >> t;
while(t--)
{
int d; cin >> d;
if(d==1)
{
cout << 6<<endl;
continue;
}
long long minn = 1e9;
for(int i = 1; i < cnt; i ++)
{
int flog = 0;
if(primes[i] - 1 >= d)
{
for(int j = i; j < cnt; j++)
{
if(primes[j] - primes[i] >= d)
{
cout << primes[i]*primes[j] << endl;
flog = 1;
break;
}
}
}
if(flog == 1)break;
}
}
return 0;
}