解析:F(x)的最大值是7,直接通过dp统计各个值的前缀和即可。
[code]:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 1e6+5;
int dp[maxn][9];
int divide(int n){
int i,j,ans = 0;
for(i = 2;i*i <= n;i++){
if(n%i) continue;
ans++;
while(n%i==0){
n /= i;
}
}
if(n != 1) return ans+1;
else return ans;
}
void preprocess(){
int i,j;
dp[2][1] = 1;
for(i = 3;i <= 1000000;i++){
for(j = 1;j < 9;j++) dp[i][j] = dp[i-1][j];
dp[i][divide(i)]++;
}
}
int main(){
int i,j,cas,l,r;
//printf("%d\n",2*3*5*7*11*13*17);
preprocess();
scanf("%d",&cas);
while(cas--){
scanf("%d%d",&l,&r);
int ans = 1;
for(i = 2;i < 9;i++){
if(dp[r][i]-dp[l-1][i]>1) ans = i;
else if(dp[r][i]-dp[l-1][i]>0){
for(j = 2*i;j < 9;j+=i){
if(dp[r][j]-dp[l-1][j]>0){
ans = i;
break;
}
}
}
}
printf("%d\n",ans);
}
return 0;
}