ABC339F 题解

\(\color{red}1\le A_i\le 10 ^ {1000}\)

\(\begin{aligned}N \\ A_1\\A_2\\ \vdots\\ A_N\end{aligned}\)

大数字加换行输入,这不明摆着让你用 Python。

当然,\(O(n^3)\) 暴力判断明显不可取,还需要一些优化 (赛时用 \(O(n^3)\) 然后没过,赛后才 AC,愤怒)

咋做呢,先对数组排序,然后用 Counter() 函数求出数组中每个数的数量,定义数组为 \(cnt\),然后定义变量 \(ans=0\),再开个 \(O(n^2)\) 循环,\(ans\leftarrow ans + cnt_{a_i\times a_j}\),如果 \(a_i\times a_j > a_{n-1}\),跳出循环并输出即可。

\(cnt_i\) 表示的是数组 \(a\) 中元素 \(i\) 的数量(前提是已经执行了 cnt = Counter(a))。

from collections import *
n = int(input())
ans = 0
a = []
for i in range(n) : 
    a.append(int(input()))
a.sort()
cnt = Counter(a)
for i in range(n):
    for j in range(n):
        ans += cnt[a[i] * a[j]]
        if a[i] * a[j] > a[n - 1] : break
print(ans)
posted @ 2024-02-04 00:18  FurippuWRY  阅读(85)  评论(0)    收藏  举报