1 条题解

  • 0
    @ 2025-8-24 23:09:28

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ARIS2_0
    路虽远,行则将至;事虽难,做则必成。

    搬运于2025-08-24 23:09:28,当前版本为作者最后更新于2025-02-06 08:31:46,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    前言

    赛时被小黄题创飞了,写个题解长长教训。

    思路

    cic_iaj=ia_j=ijj 的个数,did_ibj=ib_j=ijj 的个数。

    则对于一个数 xx,它的最大出现次数为:

    $$\sum_{i=1}^{10^9}\sum_{j=1}^{10^9}\min(c_i,d_j)[i\times j\bmod M=x] $$

    注意到这里取 min\min 是正确的,因为 ai,bi109a_i,b_i\le 10^9M=109+7M=10^9+7 是质数,所以对于 aiaja_i\not=a_j,不存在 bkb_k 使得 ai×bkaj×bk(modM)a_i\times b_k\equiv a_j\times b_k\pmod M

    所以,如果有 i×jmodM=xi\times j\bmod M=x,那 ii 乘其他数、jj 乘其他数都不能得到 xx,所以可以取 min\min

    那么,我们枚举满足 ci0c_i\not=0iidj0d_j\not=0i,ji,j,计算出 x=i×jmodMx=i\times j\bmod M,然后将 ansxans_x 加上 min(ci,dj)\min(c_i,d_j),最后计算 ansans 数组中的最大值就可以了。

    c,d,ansc,d,ans 数组需要用 unordered_map 实现,时间复杂度 O(n2)O(n^2),常数稍大。

    Code

    经过少许压行,马蜂不好还请见谅。

    #include<bits/stdc++.h>
    using namespace std;
    #define pii pair<int,int>
    unordered_map<int,int>c,d,ans;
    int main(){
    	int n;cin>>n;
        for(int i=1,p;i<=n;i++)cin>>p,c[p]++;
        for(int i=1,p;i<=n;i++)cin>>p,d[p]++;
        for(pii i:c)for(pii j:d)ans[1ll*i.first*j.first%1000000007]+=min(i.second,j.second);
        int pos=0;for(pii i:ans)pos=max(pos,i.second);cout<<pos;
    }
    
    • 1

    信息

    ID
    10893
    时间
    3000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者