hdu5317 素数筛预处理

来源:互联网 发布:java sleep唤醒 编辑:程序博客网 时间:2024/05/07 21:08

F[x] 表示x的素数种类数,求max (GCD(F[i],F[j]))    i,j在区间L,R里面

#include <iostream>#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>#include<cmath>#include<map>#include<queue>using namespace std;const int N=1e6+10;const int MAXN=(1<<31)-1;int INF=0x7f7f7f7f;int T,n,m,k,tot;const int MOD=1e9+7;int cas=1;int L,R;int f[N][10];int prime[N];int res[N];bool vis[N];void init(){    memset(f,0,sizeof f);    memset(vis,0,sizeof vis);    memset(res,0,sizeof res);    tot=0;    for(int i=2;i<N;i++){        if(!vis[i]){            prime[tot++]=i,res[i]=1;        for(int j=2;j*i<N;j++){              vis[j*i]=1;              res[j*i]++;            }        }    }    for(int i=1;i<N;i++){        for(int j=0;j<10;j++) f[i][j]=f[i-1][j];        f[i][res[i]]++;    }}int main(){#ifndef  ONLINE_JUDGE   freopen("aaa","r",stdin);#endif    int T;    int tmp[10];    scanf("%d",&T);    init();   while(T--){      scanf("%d%d",&L,&R);      for(int i=1;i<=8;i++) tmp[i]=f[R][i]-f[L-1][i];      int res=1;      for(int i=2;i<=8;i++){        int cnt=0;        for(int j=1;i*j<=8;j++)           cnt+=tmp[i*j];        if(cnt>1) res=i;      }      printf("%d\n",res);   }    return 0;}



0 0
原创粉丝点击