# zerojudge g051 最多點的線
https://zerojudge.tw/ShowProblem?problemid=g051
* 隨機化演算法
* *"保證最多點的那條直線上有超過 N/4 個點"*,所以隨機一個點出現在最長的線的機率是$\frac{1}{4}$,而選兩點在最長的線上的機率是$\frac{1}{4}\times\frac{1}{4}=\frac{1}{16}$
* 如果重複選一百次,錯誤機率只有$(\frac{15}{16})^{100}=0.001...$
* 選一百次,每次隨機兩個點,算有多少與其共線
* $O(n)$
```cpp=
#include <bits/stdc++.h>
#define EB emplace_back
#define vci vector<int>
#define PII pair<int,int>
#define F first
#define S second
#define rep(X, a,b) for(int X=a;X<b;++X)
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) (int)(a).size()
#define NL "\n"
#define LL long long
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
srand(time(NULL));
int n;
cin>>n;
rep(i,0,n) cin>>pt[i].F>>pt[i].S;
LL ans=0, dx, dy;
rep(k,0,100){
LL a=rand()%n, b, cur=2;
do b=rand()%n;
while(a==b);
dx=pt[a].F-pt[b].F, dy=pt[a].S-pt[b].S;
rep(i,0,n){
if(i==a || i==b) continue;
if(dy*(pt[i].F-pt[a].F)==(pt[i].S-pt[a].S)*dx) cur++;
}
ans=max(ans, cur);
}
cout << ans << NL;
}
```