hdu5317RGCDQ 打表

//F[x] 表示x的素数因子的大小
//问在整数区间[l,r]的数gcd的最大值
//由于F[x]的最大值为7
//可以打表存下F[i][j] 表示前j个数中有i个素数因子的有几个
//那么F[i][r] - F[i][l-1]表示的是[l,r]区间内有i个素数因子的数有几个
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 1000010 ;
int isp[maxn] ;
int sum[maxn] ;
int F[10][maxn] ;
int a[10] ;
void get_prime()
{
    memset(sum , 0 , sizeof(sum)) ;
    memset(isp , 0 ,sizeof(isp)) ;
    for(int i = 2;i < maxn;i++)
    {
        if(isp[i])continue ;
        for(int j = i ;j < maxn ;j += i)
        {
            if(i != j)
            isp[j] = 1;
            sum[j] ++ ;
        }
    }
}
int gcd(int a , int b)
{
    if(b == 0)return a ;
    return gcd(b , a%b) ;
}
int main()
{
    int T ;
    int L , R ;
    get_prime() ;
    memset(F , 0 , sizeof(F)) ;
    for(int i = 1;i < maxn;i++)
    {
        for(int j = 1;j <= 7;j++)
        F[j][i] = F[j][i-1] ;
        F[sum[i]][i]++;
    }
    scanf("%d" ,&T ) ;
    while(T--)
    {
        int l , r ;
        scanf("%d%d" ,&l , &r) ;
        int ma = 1 ;
        for(int i = 2;i <= 7;i++)
        {
            a[i] = (F[i][r] - F[i][l-1]) > 1 ? i : 1;
            if(F[i][r] - F[i][l-1] >= 2)ma = max(ma , i);
            for(int j = 2;j < i;j++)
            ma = max(gcd(a[i] , a[j]) , ma) ;
        }
        cout<<ma<<endl;
    }
}






你可能感兴趣的:(打表)