zoukankan      html  css  js  c++  java
  • POJ 2689

    YEAH DONG DONG

    终于过了。

    这样思考,首先,要把所有素数求出来是不可能的。注意到L,R的差仅一百万,那么就可以只求这个范围内的素数了。而筛选范围内的素数,就可以用上一篇的方法,使用若n为合数,则必有素因子在sqrt(n)中。

    在筛选范围内的素数2了一次,直接判断每个数是否素数,TLE。。。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    const int LPR=50000;
    const int Cprime=1000000;
    const int inf=(1<<30);
    
    bool isprime[LPR+10];
    bool gsprime[Cprime+10];
    __int64 prime[LPR],cp;
    __int64 gprime[Cprime+10],gp;
    
    void Isprime(){
    	memset(isprime,true,sizeof(isprime));
    	int e=(int)sqrt(LPR*1.0);
    	isprime[0]=isprime[1]=false;
    	for(int i=2;i<=e;i++){
    		if(isprime[i]){
    			for(int j=i*i;j<=LPR;j+=i)
    			isprime[j]=false;
    		}
    	}
    }
    
    void Doprime(){
    	cp=0;
    	for(int i=1;i<=LPR;i++)
    	if(isprime[i])
    	prime[cp++]=i;
    }
    /*
    void Fprime(__int64 tp){
    	for(__int64 i=0;prime[i]*prime[i]<=tp;i++){
    		if(tp%prime[i]==0) return ;
    	}
    	gprime[gp++]=tp;
    }
    */
    void Fprime(__int64 L,__int64 R){
    	memset(gsprime,true,sizeof(gsprime));
    	__int64 tp=L;
    	if(L==1){
    		gsprime[0]=false;
    		L++;
    	}
    	for(__int64 i=0;i<cp;i++){
    		if(prime[i]>R) break;
    		__int64 s=L/prime[i];
    		if(s*prime[i]<L)
    		s++;
    		bool flag=false;
    		for(__int64 p=s*prime[i];p<=R;p+=prime[i]){
    			if(s==1&&!flag){
    				flag=true;
    				continue;
    			}
    			gsprime[p-tp]=false;
    		}
    	}
    	for(__int64 i=0;i<=R-tp;i++)
    	if(gsprime[i])
    	gprime[gp++]=i+tp;
    }
    
    int main(){
    	__int64 L,R; __int64 mind,maxd; __int64 mil,mir,mal,mar;
    	Isprime();
    	Doprime();
    //	cout<<prime[0]<<prime[1]<<prime[2]<<prime[3]<<endl;
    	while(scanf("%I64d%I64d",&L,&R)!=EOF){
    	//	cout<<L<<' '<<R<<endl;
    		mind=inf; maxd=0;
    		gp=0;
    	/*	for(__int64 i=L;i<=R;i++){
    			if(i==2){ gprime[gp++]=i; continue; }
    			if(i%2==0) continue;
    			Fprime(i);
    		}*/
    		Fprime(L,R);
    		if(gp==0||gp==1)
    		printf("There are no adjacent primes.
    ");
    		else {
    			for(int i=0;i<gp-1;i++){
    				if(gprime[i+1]-gprime[i]<mind){
    					mind=gprime[i+1]-gprime[i];
    					mil=gprime[i]; mir=gprime[i+1];
    				}
    				if(gprime[i+1]-gprime[i]>maxd){
    					maxd=gprime[i+1]-gprime[i];
    					mal=gprime[i]; mar=gprime[i+1];
    				}
    			}
    			printf("%I64d,%I64d are closest, %I64d,%I64d are most distant.
    ",mil,mir,mal,mar);
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    第三次作业
    C语言第二次作业
    第一次作业
    C语言第六次作业
    C语言第五次作业
    C语言第四次作业
    C语言第三次作业
    C语言第二次作业
    C语言第一次作业
    C语言学习笔记(6)
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/3940589.html
Copyright © 2011-2022 走看看