Codeforces 1474 B. Different Divisors(素数筛/线性筛)

Codeforces 1474 B. Different Divisors(素数筛/线性筛)_第1张图片

官网给的题解
Codeforces 1474 B. Different Divisors(素数筛/线性筛)_第2张图片

大致题意

a有至少4个因子,a任一对因子之差大于等于d。求最小a

分析
我们找到数a的因子,首先1肯定是其因子,必须保证a的所有因子任意两个差值必须大于等于d,假设我们找到两相邻的因子m,n满足差值大于等于d,但是若m或n自身也能分解成更小的因子,那么可能存在他们的子因子的差值不能满足条件,所以我们需要求质因子。我们用素数筛存储质数存到primes[ ]中,然后在数组中寻找质因子满足条件即可。

C++代码

#include
#include
#include
#include
#include
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;
}

你可能感兴趣的:(Codeforces,素数筛/线性筛)