题意:
给n个ai,n个bi
自己选择d, 使0=d*ai+bi 的个数最多(d是实数范围) ( -1e9 <= ai,bi <= 1e9 )
d=-bi/ai,找最多的di,但不好直接除来比较,会出现精度问题
ai = ai/gcd(ai,bi), bi = bi/gcd(ai,bi) 比较两个同时相等的个数
注意几个特殊情况
ai==0&&bi==0,d随便什么都可以,另外累计
ai==0&&bi!=0,d无论如何都不能使等式为0,continue;
ac:
#include<bits/stdc++.h>
#define MAXN 200005
#define ll long long
using namespace std;
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
int n;
struct node
{
ll a,b;
}e[MAXN];
bool cmp(node x,node y)
{
if(x.a*x.b==y.a*y.b)
return x.a<y.a;
else return x.a*x.b<y.a*y.b;
}
int main()
{
int n;
ll x,y;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%I64d",&e[i].a);
for(int i=0;i<n;i++)
scanf("%I64d",&e[i].b);
ll cnt=0;
ll q=0,j=0;
for(int i=0;i<n;i++)
{
if(e[i].a==0&&e[i].b==0)
{
cnt++;
continue;
}
if(e[i].a==0&&e[i].b!=0)
continue;
ll t=gcd(e[i].a,e[i].b);
e[j].a=e[i].a/t;
e[j].b=e[i].b/t;
j++;
}
sort(e,e+j,cmp);
if(j>0)
{
ll maxs=1;
ll ans=1;
for(int i=1;i<j;i++)
{
if(e[i].a==e[i-1].a&&e[i].b==e[i-1].b)
ans++;
else{
ans=1;
}
maxs=max(ans,maxs);
}
printf("%I64d\n",maxs+cnt);
}
else printf("%I64d\n",cnt);
return 0;
}