答案为 40257
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class Main {
public static void main(String[] args){
List<Integer> list_point = new ArrayList<>();
HashSet<String> set = new HashSet<>();//存斜率
for(int i = 0;i<20;i++){
for(int j = 0;j<21;j++){
list_point.add(i*100+j);//用整数存坐标,之后用位取
}
}
int count = 0;
int size = list_point.size();
for(int i = 0;i<size;i++){
//先取x1,y1
int sum1 = list_point.get(i);
int x1 = sum1/100;
int y1 = sum1%100;
for(int j = i+1;j<size;j++){
int sum2 = list_point.get(j);
int x2 = sum2/100;
int y2 = sum2%100;
int ky = y2-y1;//斜率分子
int kx = x2-x1;//斜率分母
if(kx == 0){//平行直线额外计数
set.add(" "+ x1);
continue;
}
int flag1 = gcd(ky,kx);
String k = ky/flag1 +"/"+ kx/flag1;//以字符串的形式表示直线斜率,以免出现精度问题
int by = y2*kx - x1*ky;//截距分子
int bx = kx;//截距分母
int flag2 = gcd(by,bx);
String b = by/flag2 +"/"+ bx/flag2;//以字符串的形式表示直线截距,以免出现精度问题
set.add(k +" "+ b);//set去重
}
}
System.out.println(set.size());
}
//求a,b的最大公因数,可以把斜率约分为最简形式,以便于后面进行查重
public static int gcd(int a,int b){
return b == 0 ? a : gcd(b,a%b);
}
}