您的位置:首页 > 其它

hdu5317&15年hdu多校集训(3)b题

2015-07-31 00:22 344 查看
题目大意:有x<1000000,定义f(x),为它的素数因子,现在给你个区间,让你找出区间里边gcd(f(x1),f(x2))最大的数,其中x1,x2,在区间内

解题思路:预处理一下即可,不要用整数唯一分解定理,要超时,一个一个加着来看;

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=1000000+10;

int L,R,T;
int F[maxn],s[maxn][8];

int main()
{
   //freopen("1002.in","r",stdin);
 //  freopen("1002.out","w",stdout);
    int k,p,flag;
    memset(F,0,sizeof(F));
    k = 2;
    while (1)
    {
        p = k;
        while (p <=1000000)
        {
            F[p]++;
            p += k;
        }
        p = k + 1;
        flag = 0;
        while (p <= 100000)
        {
            if (!F[p])
            {
                k = p;
                flag = 1;
                break;
            }
            p++;
        }
        if (!flag) break;
    }
     memset(s,0,sizeof(s));
    for (int i = 2; i <= 1000000; i++)
    {
        for (int j = 1; j < 8; j++)
        {
           s[i][j] =s[i - 1][j];
            if (j == F[i])
               s[i][j]++;
        }
    }
        scanf("%d",&T);
        while(T--)
        {
                scanf("%d %d",&L,&R);
                int cnt[8];
                memset(cnt,0,sizeof(cnt));
                for(int i=1;i<=7;i++)
                {
                        cnt[i]=s[R][i]-s[L-1][i];

                }
                int ans=1;
                if(cnt[2]+cnt[4]+cnt[6]>=2) ans=2;
                if(cnt[3]+cnt[6]>=2) ans=3;
                if(cnt[4] >= 2) ans = 4;
                if(cnt[5] >= 2) ans= 5;
                if(cnt[6] >= 2) ans= 6;
                if(cnt[7] >= 2) ans= 7;
                printf("%d\n", ans);
        }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: