#include<bits/stdc++.h>
using namespace std;
struct frac{
int p,q;
};
struct func{
frac k,b;
}c[500000]={0};
int a[720][2]={0};
bool cmp(func x,func y){
if(x.k.q==0)return true;
if(y.k.q==0)return false;
if(x.k.p==0)return false;
if(y.k.p==0)return true;
if(x.k.p!=y.k.p||x.k.q!=y.k.q)
return x.k.p*y.k.q>x.k.q*y.k.p;
return x.b.p*y.b.q>x.b.q*y.b.p;
}
int gcd(int m,int n){
if(n==0)return m;
return gcd(n,m%n);
}
frac reduce(int m,int n){
frac f;
if(m==0){//zero
f.p=0;
f.q=1;
return f;
}
if(n==0){//inf
f.p=1;
f.q=0;
return f;
}
int sign=m*n/abs(m*n);
int d=gcd(abs(m),abs(n));
f.p=abs(m)/d*sign;
f.q=abs(n)/d;
return f;
}
int main(){
int n,i,j,y1,y2,x1,x2,l=0,k=1,maxk=1;
cin>>n;
for(i=0;i<n;i++)
scanf("%d%d",&a[i][0],&a[i][1]);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++){
x1=a[i][0];
y1=a[i][1];
x2=a[j][0];
y2=a[j][1];
c[l].k=reduce(y1-y2,x1-x2);
c[l++].b=reduce(y1*(x1-x2)-x1*(y1-y2),x1-x2);
}
sort(c,c+l,cmp);
for(i=1;i<l;i++){
func x=c[i-1];
func y=c[i];
if(x.k.p!=y.k.p||x.k.q!=y.k.q||
x.b.p!=y.b.p||x.b.q!=y.b.q)k=1;
else k++;
maxk=max(maxk,k);
}
k=1;
while(maxk>0){
maxk-=k;
k++;
}
cout<<k<<endl;
return 0;
}
So what should I do next?