hdu 5317 多校第三场

来源:互联网 发布:先锋软件职业学院图片 编辑:程序博客网 时间:2024/05/22 00:45

开始题意读错了   shit    wa了好久    仔细一看真是水题一枚;  

根据素数打表很容易得出每个数的F()值     从而可以看出1到1000000  F()的值最大为7  及(2*3*5*7*11*13*17)   告诉你区间    只需要在这个区间里找到这7个数分辨出先了多少次  这里用一个二维的数组leap【i】【j】(j小于等于7) 表示i之前j出现的次数    这样就很容易求出区间j的值    纪录在record数组里    就可以求GCD了  这里 我是直接把所有情况列出来了!!!


#include<stdio.h>#include<string.h>#include<iostream>using namespace std;#define LL(x) (x<<1)#define RR(x) ((x<<1)|1)int cont[1000100]={0},mark[1000010]={0},leap[1000010][8]={0};int max(int a,int b){    return a>b?a:b;}int main(){    int i,j;    memset(mark,0,sizeof(mark));    memset(cont,0,sizeof(cont));    for(i=2;i<=1000000;i++)    {        if(mark[i]) continue;        cont[i]=1;        for(j=i+i;j<=1000000;j+=i)        {            cont[j]++;            mark[j]=1;        }    }        for(i=2;i<=1000000;i++)    {        for(j=1;j<=7;j++)        {            leap[i][j]=leap[i-1][j];            }        leap[i][cont[i]]++;    }        int T,L,R;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&L,&R);        int record[8];        memset(record,0,sizeof(record));        for(i=1;i<=7;i++)        {            record[i]=leap[R][i]-leap[L-1][i];        }        int ans=1;        for(i=1;i<=7;i++)        {            if(record[i]==0) continue;            if(record[i]>1) ans=max(ans,i);            for(j=i+1;j<=7;j++)            {                if(record[j]==0) continue;                else if(i==2&&j==4)                {                    if(ans<2) ans=2;                }                else if(i==2&&j==6)                {                    if(ans<2) ans=2;                }                else if(i==4&&j==6)                {                    if(ans<2) ans=2;                }                else if(i==3&&j==6)                {                    if(ans<3) ans=3;                }            }        }        printf("%d\n",ans);    }    return 0;} 

0 0