Codeforces 1474 B.さまざまな除数(プライムふるい/リニアふるい)

ここに画像の説明を挿入

公式ウェブサイトによって与えられた解決策
ここに画像の説明を挿入

一般的な意味

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

おすすめ

転載: blog.csdn.net/diviner_s/article/details/112907462