Die gerade Linie der täglichen realen Fragen des Blue Bridge Cup

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, CvectorsetWas 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}Y1und2( und und1)=x1x2x 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( und2Y1) x+( x1x2) und+( x2Y1x1Y2)=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=Y2Y1B=x1x2C=x2Y1x1Y2, dann entfernen wir die gemeinsamen Faktoren der drei und setzen sie vectorein und setzen sie dann ein set, um die Berechnung einer Linie zu vervollständigen. Schließlich müssen wir nur noch setdie 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
*/

Ich denke du magst

Origin blog.csdn.net/m0_46201544/article/details/123910901
Empfohlen
Rangfolge