http://acm.hdu.edu.cn/showproblem.php?pid=5020
求3点共线的组合数
极角排序然后组合数相加
#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <queue> #include <vector> #include<map> #include <iostream> #include <algorithm> using namespace std; #define RD(x) scanf("%d",&x) #define RD2(x,y) scanf("%d%d",&x,&y) #define clr0(x) memset(x,0,sizeof(x)) typedef long long LL; typedef pair<int,int> pii; const double INF=2100000000; struct point { int x,y; }p[1010]; int cmp(point a,point b) { return (a.x == b.x && a.y < b.y) || a.x < b.x; } int gcd(int a,int b) { return b == 0? a:gcd(b,a%b); } map <pii,int> hash; int main() { int _,n; RD(_); while(_--){ RD(n); for(int i = 0;i < n;++i) RD2(p[i].x,p[i].y); sort(p,p+n,cmp); map<pii,int>::iterator it; int ans = 0; for(int i = 0;i < n - 1;++i){ hash.clear(); for(int j = i+1;j < n;++j){ int dx = p[j].x - p[i].x,dy = p[j].y - p[i].y; int g = gcd(dx,dy); dx /= g,dy /= g; hash[make_pair(dx,dy)]++; } for(it = hash.begin();it != hash.end();++it){ int x = it->second; ans += x*(x - 1)/2; } } cout<<ans<<endl; } return 0 ; }