当前位置: 代码迷 >> 综合 >> 【Codeforces Round #544 (Div. 3) D. Zero Quantity Maximization】GCD
  详细解决方案

【Codeforces Round #544 (Div. 3) D. Zero Quantity Maximization】GCD

热度:59   发布时间:2023-12-29 02:04:57.0

D. Zero Quantity Maximization

题意

给你两个长度为nnn的数组aaa,bbbci=ai×d+bic_i = a_i \times d +b_ici?=ai?×d+bi?,现在找到一个ddd使尽量多的cic_ici?000
1≤n≤1051 \leq n \leq 10^51n105
?109≤ai,bi≤109-10^9 \leq a_i,b_i \leq10^9?109ai?,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;
}
  相关解决方案