直线
思路
两点式直线方程化简可得:Ax + By + C = 0
(y1-y2) * x + (x2-x1) * y + x1 * y2 - x2 * y1 = 0;
先用vector存储所有坐标,再求得两点式方程,对求出A,B,C的最大公约数进行约分,最后加入到set里去重
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int>PII;
typedef pair<PII, int>PIII;
vector<PII>v;
set<PIII>s;
int gcd(int a, int b){
return !b ? a : gcd (b, a%b);
}
int main() {
int x, y;
cin >> x >> y;
for(int i = 0; i < x; i++){
for(int j = 0; j < y; j++){
v.push_back({i, j});
}
}
for(int i = 0; i < v.size(); i++){
for(int j = i+1; j < v.size(); j++){
int x1 = v[i].first, y1 = v[i].second;
int x2 = v[j].first, y2 = v[j].second;
int A = y2-y1, B = x2 - x1, C = x1*y2-x2*y1;
int t = gcd(gcd(A, B), C);
s.insert({{A/t, B/t}, C/t});
}
}
cout << s.size() << endl;
return 0;
}
答案是:40257