D. Zero Quantity Maximization
题意
给你两个长度为nnn的数组aaa,bbb,ci=ai×d+bic_i = a_i \times d +b_ici?=ai?×d+bi?,现在找到一个ddd使尽量多的cic_ici?为000。
1≤n≤1051 \leq n \leq 10^51≤n≤105
?109≤ai,bi≤109-10^9 \leq a_i,b_i \leq10^9?109≤ai?,bi?≤109
做法
设ci=0c_i=0ci?=0,那么d=?biaid=-\frac{b_i}{a_i}d=?ai?bi??,只需要看哪个d出现次数最多即可,这里我怕被卡精度,于是存分数约分后的最简形式即可,这里要注意ai=0,bi=0a_i=0,b_i=0ai?=0,bi?=0等情况。
代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int,int> pii;
const int maxn = 2e5+5;
map<pii,int> mp;
int a[maxn],b[maxn];
int main()
{
int n;scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) scanf("%d",&b[i]);int ans=0;int tmp=0;for(int i=1;i<=n;i++){
if(a[i]==0&&b[i]==0){
tmp++;continue;}else if(a[i]==0) continue;if(b[i]==0){
mp[pii(0,1)]++;ans=max(ans,mp[pii(0,1)]);continue;}int up=-b[i]/__gcd(a[i],b[i]);int down=a[i]/__gcd(a[i],b[i]);if(up<0){
up=up*-1;down=down*-1;}mp[pii(up,down)]++;ans=max(ans,mp[pii(up,down)]);}printf("%d\n",ans+tmp);return 0;
}