HDU 3823 埃式筛法打表

Posted edviv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 3823 埃式筛法打表相关的知识,希望对你有一定的参考价值。

题意:有T个样例,每个样例输入两个数 a 和 b,让你找到一个数,使得 a + x = c, b + x = d, c 和 d

是质数并且相邻。

解法:打素数表(埃式筛法)

不成立: (b - a)&1

或 b == a

成立:

特殊: a = 1 , b = 2, ans = 1;

a = 2, b = 3, ans = 0;

(c != a, d != b, b - a = d - c ) && b <= d,  ans = d - b;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 2e7 + 7;
bool vis[N];
int primes[N];
int idx;
int T,a,b;
void prime()  //打表
{
    memset(vis,0,sizeof(vis));
    idx = 0;
    for(int i = 2; i < N; i++)
    {
        if(!vis[i])
        {
            primes[idx] = i;
            idx++;
            for(int j = 2*i; j < N; j += i) vis[j] = true;
        }
    }
}
int main()
{
    int s = 0;
    prime();
    scanf("%d",&T);
    while(T--)
    {
        s++;
        scanf("%d%d",&a,&b);
        if(a>b) swap(a,b);

        int c = b - a;

        int t = 0;
        if(a == 1 && b == 2)
        {
            printf("Case %d: %d
",s,1);
            continue;
        }
        if(a == 2 && b == 3)
        {
            printf("Case %d: %d
",s,0);
            continue;
        }
        if(c & 1 || a == b)
        {
            printf("Case %d: %d
",s,-1);
            continue;
        }
        else
        {
            for(int i = 1; i < idx; i++)
            {
                t = primes[i] - primes[i-1];
                if(t == c && b <= primes[i])
                {
                    printf("Case %d: %d
",s,primes[i]-b);
                    break;
                }
            }
        }
    }
    return 0;
}

以上是关于HDU 3823 埃式筛法打表的主要内容,如果未能解决你的问题,请参考以下文章

埃式筛法

埃式筛法

python埃式筛法求素数

素数筛法

线性筛法

2021-5-13 线性筛法(质数)