📌  相关文章
📜  国际空间研究组织 | ISRO CS 2011 |问题 53(1)

📅  最后修改于: 2023-12-03 15:23:02.993000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2011 | 问题 53

这是一个与 C++ 编程相关的问题,涉及到输入和输出操作。

题目描述

给你一个带有 $n$ 个整数的数组 $a$,请你统计其中有多少对不同的 $(i, j)$,满足 $i < j$ 且 $a_i+a_j$ 能被 5 整除。

输入格式

第一行包含一个整数 $n$。

第二行包含 $n$ 个整数 $a_i$。

输出格式

输出一个整数,表示满足条件的不同的 $(i, j)$ 的数量。

数据范围

$1 \le n \le 10^5$,

$-10^9 \le a_i \le 10^9$

题解

题目要求我们找到满足 $i < j, a_i+a_j \bmod 5 = 0$ 的不同的 $(i, j)$ 的数量。我们可以枚举每一个数 $a_i$,看它与哪些数 $a_j \ (i < j)$ 的和能被 5 整除,然后计数即可。

对于确定的一个数 $a_i$ 和它所对应的余数 $r$,其能和哪些数 $a_j \ (j > i)$ 的余数相加得到 5 的倍数呢?显然,只需要考虑 $a_j$ 能够和 $a_i$ 共同构成集合 $\left{\left{1,4\right},\left{2,3\right}\right}$ 中的一个即可。

于是,我们可以先对 $a$ 中每一个数取模 5,然后枚举每一个模数,统计每个模数中出现的数的个数 $cnt$。对于每一个模数 $r$,它所对应的数的个数是 $cnt[r]$,我们只需要计算满足 $i < j$ 且 $a_i+a_j \bmod 5 = 0$ 的不同的 $(i, j)$ 的数量即可。

对于选出的两个数 $a_i$ 和 $a_j$,它们所对应的余数分别为 $r_1$ 和 $r_2$。我们可以计算所有可能的余数对 $(r_1,r_2)$,统计它们总共出现的次数 $p$,然后将不同余数对总和即可。

不难证明,对于一个余数 $r$,有 $\binom{cnt[r]}{2}$ 种满足条件的 $(i, j)$,因此总数是

$$ ans = \sum_{r = 0}^{4}\binom{cnt[r]}{2} $$

我们只需要求出 $cnt$ 数组即可,时间复杂度为 $O(n)$。

参考代码

C++ 代码