//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;
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-08 13:34:30