📅  最后修改于: 2023-12-03 15:23:02.993000             🧑  作者: Mango
这是一个与 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++ 代码