CodeForces - 817B Makes And The Product(组合数学 + 思维)

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;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值