暴力枚举
a3 <= a * b * c <= 10 6
a3 <= 106
a <= 10 2,看别人的题解,说这里可以去掉等于号,但我不知道为什么
因为 a<=102 所以 abc 必定大于b2 ,证明过程
abc-b2 = 10 2 b(b+a) - b2 = 102 (b2+ab)-b2>=0
所以b2<=abc<=106
所以b2<=106
所以 b<=103
又因为三角形定理得 a+b>c 所以缩小范围
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static boolean check(int a,int b,int c){
// a + b > c
// a + c > b
// b + c > a
if(a+b>c && a+c > b && c+b>a)
return true;
return false;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int len = (int)1e6;
long[] sum = new long[len+100];
for(int a=1;a<=100;a++){
for(int b=a+1;b<=1000;b++){
for(int c=b+1;c<a+b;c++)
if(check(a,b,c) && a*b*c<=len)
sum[a*b*c]++;
}
}
for(int i=1;i<=len;i++)
sum[i] = sum[i-1]+sum[i];
int cnt = Integer.parseInt(br.readLine());
while(cnt-->0){
String[] content = br.readLine().split(" ");
int l = Integer.parseInt(content[0]);
int r = Integer.parseInt(content[1]);
System.out.println(sum[r]-sum[l-1]);
}
br.close();
}
}