HDU 5317 RGCDQ

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317


题意:一个数n可以分解成若干个质数相乘的等式(如12=2*2*3有2个不同的质数,10=2*5有2个不同的质数),那么我们认为f(12)=2,f(10)=2,求gcd(f[L],f[R])


思路:1<= L,R <= 1000000,2*3*5*7*11*13*17*19大于1000000,因此最多有7种质数,f[x]<=7,我们用素数筛法可以预处理出1000000以内所有数的f[x],然后处理所有的情况就可以了


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxn 1000000
using namespace std;

int prime[maxn+30],num[maxn+30][10];

void init()
{
    memset(num,0,sizeof(num));
    memset(prime,0,sizeof(prime));
    for (int i=2;i<=maxn;i++)
    {
        if (!prime[i])
        {
            for (int j=i*2;j<=maxn;j+=i)
            {
                prime[j]++;
            }
        }
    }

    for (int i=2;i<=maxn;i++)
    {
        for (int j=1;j<=7;j++)
         num[i][j]=num[i-1][j];
        num[i][prime[i]]++;
    }
}

int main()
{
    init();
    int t,l,r;
    scanf("%d",&t);
    while (t--)
    {
        int tmp[10];
        scanf("%d%d",&l,&r);
        for (int i=1;i<=7;i++)
        {
            tmp[i]=num[r][i]-num[l-1][i];
        }

        int res;
        if (tmp[7]>=2)
            res=7;
        else if (tmp[6]>=2)
            res=6;
        else if (tmp[5]>=2)
            res=5;
        else if (tmp[4]>=2)
            res=4;
        else if (tmp[3]>=2 || tmp[6] && tmp[2])
            res=3;
        else if (tmp[2]>=2 || (tmp[6] && tmp[3]) || (tmp[4] && tmp[2]))
            res=2;
        else
            res=1;

        printf("%d\n",res);

    }
}



你可能感兴趣的:(ACM,HDU)