Thema Quelle
2021 Blue Bridge Cup Provinzial
Themenlink: http://acm.mangata.ltd/p/P1485
Testzentrum
Mathematik, Gewalt
Video-Erklärung
https://www.bilibili.com/video/BV1BY411J795
Ideen
Da die ausgewählten Punkte alle ganzzahlige Koordinaten sind, wählen wir höchstens 21 × 20 = 420 21\times 20 = 4202 1×2 0=4 20 Punkte , dann können wir alle zwei Punkte als gerade Linie auswählen, aber in diesem Fall kann es zu einer wiederholten Auswahl einer Linie kommen, also müssen wir deduplizieren, also wie deduplizieren? Wir wissen, dass die Standardgleichung für eine Gerade lautet:A x + By + C = 0 Ax+By+C = 0Ein x+B y+C=0 Dann brauchen wir also nur nochA , B , CA, B, CA , B , C ist in Ordnung, aber hier müssen Sie aufA , B , CA, B, CA , B , C müssen vereinfacht werden, sonst können wir den Effekt der Deduplizierung nicht erreichen.Für die Deduplizierung der Struktur von drei oder mehr Elementen können wir uns dafür entscheiden, eine Struktur selbst zu schreiben, aber Wir können es auch direkt verwendenvector
. Dann werfen Sie jedeshineinA , B , CA, B, Cvector
set
Was ist mit A , B , C ? , kennen wir alle die Gleichung der durch zwei Punkte bestimmten Geraden:( 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− und2( und − und1)=x1− x2x − x1Dann können wir erhalten: ( 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( und2−Y1) x+( x1−x2) und+( x2Y1−x1Y2)=0
Wir können erhalten: 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_2EIN=Y2−Y1、B=x1−x2、C=x2Y1−x1Y2, dann entfernen wir die gemeinsamen Faktoren der drei und setzen sie vector
ein und setzen sie dann ein set
, um die Berechnung einer Linie zu vervollständigen. Schließlich müssen wir nur noch set
die Größe des Behälters ausgeben.
Code
#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
*/