zoukankan      html  css  js  c++  java
  • 【UVA10140】Prime Distance

    题目大意:求出一个给定区间 [l, r] 内相邻素数之间的最大距离和最小距离。

    题解:由于 l, r 的范围太大,没法直接用筛法得出区间的素数。考虑筛出区间的素数等价于筛掉区间内的所有和数, 根据算术基本定理,若 (xin [l,r]) 为和数,则 x 一定有一个小于 (sqrt(r)) 的质因子,利用这条性质可知,只需预处理出十万以内的所有素数,并用这些素数去筛掉给定区间的和数即可。

    代码如下

    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define pb push_back
    #define mp make_pair
    #define all(x) x.begin(),x.end()
    #define cls(a,b) memset(a,b,sizeof(a))
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> P;
    const int dx[]={0,1,0,-1};
    const int dy[]={1,0,-1,0};
    const int mod=1e9+7;
    const int inf=0x3f3f3f3f;
    const int maxn=1e6+10;
    const double eps=1e-6;
    inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    inline ll sqr(ll x){return x*x;}
    inline ll fpow(ll a,ll b,ll c){ll ret=1%c;for(;b;b>>=1,a=a*a%c)if(b&1)ret=ret*a%c;return ret;}
    inline ll read(){
    	ll x=0,f=1;char ch;
    	do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
    	do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
    	return f*x;
    }
    /*------------------------------------------------------------*/
    
    int l,r;
    bool vis[100005],is[1000005];
    vector<int> p;
    
    void parse(){
    	vis[1]=1;int n=1e5;
    	for(int i=2;i<=n;i++){
    		if(vis[i])continue;
    		p.pb(i);
    		for(int j=i;j<=n/i;j++)vis[i*j]=1;
    	}
    }
    void solve(){
    	cls(is,0);
    	if(l==1)is[0]=1;
    	for(int i=0;i<p.size();i++){
    		if(p[i]>r)break;
    		for(int j=(l-1)/p[i]+1;j<=r/p[i];j++){
    			if(j==1)continue;
    			is[j*p[i]-l]=1;
    		}
    	}
    	int mi=inf,mx=0,a1,a2,b1,b2,pre=-1;
    	for(int i=0;i<=r-l;i++){
    		if(is[i])continue;
    		if(pre==-1){pre=i+l;continue;}
    		if(i+l-pre>mx)mx=i+l-pre,b1=pre,b2=i+l;
    		if(i+l-pre<mi)mi=i+l-pre,a1=pre,a2=i+l;
    		pre=i+l;
    	}
    	if(!mx)puts("There are no adjacent primes.");
    	else printf("%d,%d are closest, %d,%d are most distant.
    ",a1,a2,b1,b2);
    }
    int main(){
    	parse();
    	while(scanf("%d%d",&l,&r)!=EOF)solve();
    	return 0;
    }
    
  • 相关阅读:
    start with connect by prior 递归查询用法(二)
    start with connect by prior 递归查询用法(一)
    oracle之spool详细使用总结
    关于ETL面试相关
    ETL常用的三种工具介绍及对比Datastage,Informatica和Kettle
    Oracle执行计划详解
    随机函数的使用(DBMS_RANDOM)
    oracle中的替换函数replace和translate函数
    ces
    文章11
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10526914.html
Copyright © 2011-2022 走看看