Makes And The Product
After returning from the army Makes received a gift — an array a consisting of npositive integer numbers. He hadn't been solving problems for a long time, so he became interested to answer a particular question: how many triples of indices (i, j, k) (i < j < k), such that ai·aj·ak is minimum possible, are there in the array? Help him with it!
Input
The first line of input contains a positive integer number n (3 ≤ n ≤ 105) — the number of elements in array a. The second line contains n positive integer numbersai (1 ≤ ai ≤ 109) — the elements of a given array.
Output
Print one number — the quantity of triples (i, j, k) such that i, j and k are pairwise distinct and ai·aj·ak is minimum possible.
Examples
Input
4
1 1 1 1
Output
4
Input
5
1 3 2 3 4
Output
2
Input
6
1 3 3 1 3 2
Output
1
Note
In the first example Makes always chooses three ones out of four, and the number of ways to choose them is 4.
In the second example a triple of numbers (1, 2, 3) is chosen (numbers, not indices). Since there are two ways to choose an element 3, then the answer is 2.
In the third example a triple of numbers (1, 1, 2) is chosen, and there's only one way to choose indices.
题意:给一组数,求三元组 (i,j,k) i < j < k 的个数,要求 a[i] * a[j] * a[k] 最小。
这个题真的不要想多了,a[i] * a[j] * a[k] 最小,只有一种情况, a[i] ,a[j] , a[k] 最小,乘积最小。不可能出现 几个数不同,还乘积同时都是最小乘积。 如 3 * 8 = 4 * 6 是不存在的(我做的时候就是这样想的,望大佬不要嘲笑,I 蒟蒻一个)。
分情况讨论一下就可以了;
①a[1]=a[2]=a[3],三元素相同,那么同理可以统计所有与这三元素相等的个数,假设cnt个,结果就是组合数
②a[1]=a[2]<a[3],这样我们还得统计后续等于a[3]的元素个数,假设cnt个,结果就是cnt
③a[1]<a[2]=a[3],这样我们还得统计后续等于a[3]的元素个数,假设cnt个,结果就是
④a[1]<a[2]<a[3],这样我们还得统计后续等于a[3]的元素个数,假设cnt个,结果也是cnt
注意:直接乘完 然后 再除就行了,不然会WA,不要担心会爆
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
long long a[maxn];
int main()
{
int n; scanf("%d",&n);
for(int i = 0;i < n;i ++)
scanf("%I64d",&a[i]);
sort(a,a + n);
long long cnt = 0;
long long sum = 0;
for(int i = 2;i < n;i ++)
if(a[i] == a[2]) cnt ++;
else break;
if(a[0] == a[1]){
if(a[1] == a[2]){
cnt += 2;
sum = cnt * (cnt - 1)* (cnt - 2) / 6 ;
}
else {
sum = cnt;
}
}
else {
if(a[1] == a[2]){
cnt ++;
sum = cnt / 2 * (cnt - 1);
}
else sum = cnt;
}
printf("%I64d\n",sum);
return 0;
}