n个数字中任选4个数,要求a*b=c*d,求有几种选法?

先考虑没有重复的数的情况,那么只要O(n^2)枚举所有数对的积即可。
有重复的数的情况又分成两类:
1. 如果a/b/c/d均不相同,那么在上面算法的基础上再统计一下每个相同的数字出现了多少次,乘一乘即可。
【n个数字中任选4个数,要求a*b=c*d,求有几种选法?】 2. 如果a/b/c/d里有相同的数,那么只有三种情况:要么是a*a=b*c,要么是a*b=a*b,要么是a*a=a*a,显然都能在O(n^2)内搞定。

■网友
果然蒟蒻只靠脑子想不去实现的算法八成有问题…先考虑4个数互不一样的情况吧…把n个数去重排序 处理所有二元组的积及其出现的次数 对所有大于等于2的次数排列组合一下实现时可以先把所有二元组的积离散化 再统计出现次数 O(n^2logn)的时间 O(n^2)的空间可以实现然后a*b=a*b这种情况找出所有出现次数大于1的数 对所有这些数的二元组排列组合一下最后4个数相同的情况 对出现次数大于3的数排列组合一下总时间是O(n^2logn)的…
■网友
好吧,仔细想想就是最高赞的想法,好像删不了,就这样吧


    推荐阅读