由于浮点数精度有限会出现误差,本题应采用最简分数记录
#include<iostream>
#include<map>
#include<cmath>
#include<algorithm>
using namespace std;
//辗转相除法求最大公因数
int f(int x, int y) {
return y ? f(y, x % y) : x;
}
const int maxn = 2e5 + 5;
int a[maxn], b[maxn];
map<pair<int, int>, int> mp;
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
for (int i = 0; i < n; ++i) {
cin >> b[i];
}
int t = 0;
for (int i = 0; i < n; ++i) {
//三个特例单独算
if (a[i] == 0 && b[i] != 0) {
continue;
}
else if (a[i] == 0 && b[i] == 0) {
t++;
continue;
}
else if (a[i] != 0 && b[i] == 0) {
if (!mp.count(make_pair(1, 0))) {
mp[make_pair(1, 0)] = 0;
}
mp[make_pair(1, 0)]++;
continue;
}
//求出绝对值的最大公倍数
int d = f(abs(a[i]), abs(b[i]));
//异号则其中一个为负数,固定a[i]为负数或者b[i]为负数
if (a[i] > 0 && b[i] < 0 || a[i] < 0 && b[i] > 0) {
a[i] = -1 * abs(a[i]) / d;
b[i] = abs(b[i]) / d;
}
//同号则全为正数或者全为负数
else {
a[i] = abs(a[i]) / d;
b[i] = abs(b[i]) / d;
}
//记录数目
if (!mp.count(make_pair(a[i], b[i]))) {
mp[make_pair(a[i], b[i])] = 0;
}
mp[make_pair(a[i], b[i])]++;
}
int ans = 0;
for (map<pair<int, int>, int>::iterator it = mp.begin(); it != mp.end(); ++it) {
ans = max(ans, it->second);
}
cout << ans + t << endl;
return 0;
}