#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 5000001;
int a,b,ans,n;
int num[maxn];
bool vis[maxn];
int cnt[maxn],tmp[maxn];
vector<int> prime;
bool isprime[maxn];
void getprime(){
memset(isprime,0,sizeof isprime);
for(long long i = 2; i < maxn; i++){
if(!isprime[i]){
prime.push_back(i);
for(long long j = i*i ; j < maxn; j+= i )
isprime[j] = 1;
}
}
}
int getc(int x){
int ans = 1,a= 0;
while(prime[a]*prime[a] <= x){
int cnt = 1;
while(x%prime[a]==0){
x /= prime[a];
cnt++;
}
a++;
ans *= cnt;
}
if(x>1) ans *= 2;
return ans;
}
void count_sort(int *a,int *b ,int k){
int c[411];
memset(c,0,sizeof c);
for(int i = 1; i <= n; i++){
c[a[i]]++;
}
for(int i = 1; i <= k; i++){
c[i] += c[i-1];
}
for(int i = n; i >= 1; i--){
b[c[a[i]]] = a[i];
c[a[i]]--;
}
}
int main(){
int ncase;
memset(vis,0,sizeof vis);
getprime();
cin >> ncase;
while(ncase--){
cin >> a >> b;
for(int i = a; i <= b; i++){
if(!vis[i]){
vis[i] = 1;
num[i] = getc(i);
}
}
n = b-a+1;
for(int i = 1; i <= n; i++) tmp[i] = num[i+a-1];
count_sort(tmp,cnt,410);
int head=cnt[1],last = cnt[1];
int i = 2;
ans = 0;
while(i<n){
ans = max(ans,cnt[i]-head);
ans = max(ans,cnt[i+1]-last);
head = cnt[i];
last = cnt[i+1];
i += 2;
}
if(i==n){
ans = max(ans,cnt[n]-head);
ans = max(ans,cnt[n]-last);
}
cout<<ans<<endl;
}
return 0;
}
UVa11411 - MiniMice,布布扣,bubuko.com
原文:http://blog.csdn.net/mowayao/article/details/22088273