fuente del tema
Copa Puente Azul Provincial 2021
Enlace del tema: http://acm.mangata.ltd/p/P1485
centro de pruebas
matemáticas, violencia
Vídeo explicación
https://www.bilibili.com/video/BV1BY411J795
ideas
Como todos los puntos seleccionados son coordenadas enteras, seleccionamos como máximo 21 × 20 = 420 21\times 20 = 4202 1×2 0=4 20 puntos , entonces podemos seleccionar cada dos puntos como una línea recta, pero en este caso, puede haber una selección repetida de una línea, por lo que necesitamos deduplicar, entonces, ¿cómo deduplicar? Sabemos que la ecuación estándar para una recta es:A x + By + C = 0 Ax+By+C = 0una x+por _+C=0 Entonces eso significa que solo necesitamos determinarA , B , CA, B, CA , B , C está bien, pero aquí debes prestar atención aA , B , CA, B, CA , B , C deben simplificarse, de lo contrario no podremos lograr el efecto de desduplicación.Para la desduplicación de la estructura de tres o más elementos, podemos optar por escribir una estructura por nosotros mismos, pero También podemos usarlo directamentevector
, luego arrojar cada uno,A, B, CA, B, Cvector
set
¿Qué pasa con A , B , C ? , todos conocemos la ecuación de la recta determinada por dos puntos:( y − y 1 ) y 1 − y 2 = x − x 1 x 1 − x 2 \frac{(y - y_1)}{y_1-y_2} = \frac{x-x_1}{x_1-x_2}y1−y2(y−y1)=X1− x2x − x1Entonces podemos obtener: ( y 2 − y 1 ) x + ( x 1 − x 2 ) y + ( x 2 y 1 − x 1 y 2 ) = 0 (y_2 - y_1)x + ( x_1-x_2)y + (x_2y_1-x_1y_2) = 0(y2−y1) x+( X1−X2)y+( X2y1−X1y2)=0
Podemos obtener: A = y 2 − y 1 , B = x 1 − x 2 , C = x 2 y 1 − x 1 y 2 A=y_2 - y_1, B=x_1-x_2, C =x_2y_1-x_1y_2UN=y2−y1、B=X1−X2、C=X2y1−X1y2, luego quitamos los factores comunes de los tres y los ponemos vector
, y luego los ponemos set
para completar el cálculo de una línea. Finalmente, solo necesitamos generar set
el tamaño del contenedor.
código
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
const double eps = 0.0000001;
int main()
{
vector<PII> Point;
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n = 20,m = 21;
// cin>>n>>m;
for(int x = 0;x < n; ++x)
for(int y = 0;y < m; ++y)
Point.push_back({
x,y});
int l = Point.size();
set<vector<int>> ans;
for(int i = 0;i < l; ++i) {
for(int j = i + 1;j < l; ++j) {
vector<int> t;
int x1 = Point[i].first,y1 = Point[i].second;
int x2 = Point[j].first,y2 = Point[j].second;
int a,b,c;
a = y2 - y1;
b = x1 - x2;
c = x2 * y1 - x1 * y2;
int d = __gcd(__gcd(a,b),c);
t.push_back(a/d);
t.push_back(b/d);
t.push_back(c/d);
ans.insert(t);
}
}
cout<<ans.size()<<endl;
return 0;
}
/*
ans = 40257
*/