题目链接
给定一列数 a1,a2,⋯,an,求有多少个 ⟨i,j⟩ 对使得 aiaj 为平方数。
特殊的数据范围:0≤ai≤2×105。
对于任意两个整数 a,b,有 a2×b2=(ab)2。即,两个平方数相乘仍为平方数。
拿到这道题我们很容易想到作唯一分解,一个数 x=p1α1p2α2⋯ 不是平方数当且仅当 ∃αi 为奇数。联系到提示的内容,一个数的平方数因子是无用的,考虑令 dx 为满足 dx 为完全平方数且 dx∣x 的最大值,则两个整数 x 与 y 相乘后的乘积为平方数当且仅当 xdx=ydy,因此我们可以用 O(ai) 的时间复杂度求出每个 ai 的 dai,再使用 这道题 中的经典 trick 即可在 O(nmaxi=1nai) 的时间复杂度内解决问题。
见提交记录。