0x31 数学知识-质数-A Prime Distance

链接:https://ac.nowcoder.com/acm/contest/1021/A
来源:牛客网

The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticians for thousands of years is the question of primality. A prime number is a number that is has no proper factors (it is only evenly divisible by 1 and itself). The first prime numbers are 2,3,5,7 but they quickly become less frequent. One of the interesting questions is how dense they are in various ranges. Adjacent primes are two numbers that are both primes, but there are no other prime numbers between the adjacent primes. For example, 2,3 are the only adjacent primes that are also adjacent numbers.
Your program is given 2 numbers: L and U (1≤L

数论是数学的一个分支,它是关于数的性质的。几千年来吸引了数理论家兴趣的领域之一是原始性问题。素数是指没有适当因子的数(它只能被1和它本身整除)。第一个素数是2,3,5,7,但它们很快就变得不那么频繁了。其中一个有趣的问题是,它们在不同范围内的密度有多大。相邻素数是两个都是素数的数,但相邻素数之间没有其他素数。例如,2,3是唯一相邻的素数,也是相邻的数。
你的程序有两个号码:l和U(1≤L

#include 
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define db printf("where!\n");
#define pb push_back
using namespace std;
#define ll long long
#define MP std::make_pair
ll gcd(ll x,ll y){return y ? gcd(y,x%y) : x;}
template<class T>inline void read(T &res){
char c;T flag=1;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
const int maxn=1e6;
int prime[maxn+10];
 
void getPrime()//使用欧拉筛法
{
    for(int i=2;i<=maxn;i++)
    {
        if(!prime[i])
            prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&prime[j]<=maxn/i;j++)
        {
            prime[prime[j]*i]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}
 
bool isprime[maxn+10];
int prime2[maxn+10];
 
void getPrime2(int L,int R)
{
    memset(isprime,1,sizeof(isprime));
    if(L<2) L=2;
    for(int i=1;i<=prime[0]&&(long long)prime[i]*prime[i]<=R;i++)
    {
        int s=L/prime[i]+(L%prime[i]>0);//计算第一个比L大且能被prime[i]整除的数是prime[i]的几倍,从此处開始筛
        if(s==1)//非常特殊,假设从1開始筛的话,那么2会被筛成非素数
            s=2;
        for(int j=s;(long long)j*prime[i]<=R;j++)
            if((long long)j*prime[i]>=L)
            isprime[j*prime[i]-L]=false; //区间映射 ,比方区间长度为4的区间[4,7],映射到[0,3]中,由于题目范围2,147,483,647数组开不出来
    }
    prime2[0]=0;
    for(int i=0;i<=R-L;i++)
        if(isprime[i])
        prime2[++prime2[0]]=i+L;
}
 
int main()
{
    getPrime();
    int L,R;
    while(scanf("%d%d",&L,&R)!=EOF)
    {
        getPrime2(L,R);
        if(prime2[0]<2)
            printf("There are no adjacent primes.\n");
        else
        {
            int x1=0,x2=1000000,y1=0,y2=0;
            for(int i=1;i<prime2[0];i++)
            {
                if(prime2[i+1]-prime2[i]<x2-x1)
                {
                    x1=prime2[i];
                    x2=prime2[i+1];
                }
                if(prime2[i+1]-prime2[i]>y2-y1)
                {
                    y1=prime2[i];
                    y2=prime2[i+1];
                }
            }
            printf("%d,%d are closest, %d,%d are most distant.\n",x1,x2,y1,y2);
        }
    }
    return 0;
}

你可能感兴趣的:(0x31 数学知识-质数-A Prime Distance)