1. 程式人生 > >817B. Makes And The Product

817B. Makes And The Product

1.題目描述:

B. Makes And The Product time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output

After returning from the army Makes received a gift — an array a consisting of n positive 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·akis 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 npositive integer numbers ai (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.


2.題意概述:

給你n個數a[1...n]問你滿足ai·aj·ak是最小,且i<j<k的有序對有幾個?

3.解題思路:

考慮先排序(為什麼?方便後續統計),這樣保證ai<aj<ak。那麼顯然最小值就是a[1]*a[2]*a[3],但是這樣可能有多個值,我們統計一下大概分為這四種情況:

①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

綜上就討論出了結果。注意的是組合數會爆int,而且最好最後再除,不然會丟數

4.AC程式碼:

#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define maxn 100010#define lson root <<1#define rson root <<1|1#define lent (t[root].r - t[root].l +1)#define lenl (t[lson].r - t[lson].l +1)#define lenr (t[rson].r - t[rson].l +1)#define N 1111#define eps 1e-6#define pi acos(-1.0)#define e exp(1.0)usingnamespace std;constint mod =1e9+7;typedeflonglong ll;typedefunsignedlonglong ull;int a[maxn];
ll vis[3];int main(){#ifndef ONLINE_JUDGE
	freopen("in.txt","r", stdin);
	freopen("out.txt","w", stdout);long _begin_time = clock();#endifint n;while(~scanf("%d",&n)){for(int i =1; i <= n; i++)
			scanf("%d",&a[i]);
		sort(a +1, a + n +1);
		memset(vis,0,sizeof(vis));int cnt =0;
		vis[0]=1;for(int i =2; i <=3; i++)if(a[i]== a[i -1])
				vis[cnt]++;else
				vis[++cnt]++;for(int i =4; i <= n; i++)if(a[i]== a[i -1])
				vis[cnt]++;elsebreak;//	printf("%d %d %d: ", vis[0], vis[1], vis[2]);
		ll ans =0;if(cnt ==0)
			ans = vis[0]*(vis[0]-1)*(vis[0]-2)/6;elseif(cnt ==1){if(a[2]== a[1])
				ans = vis[1];else
				ans = vis[1]*(vis[1]-1)/2;}else
			ans = vis[2];
		printf("%I64d\n", ans);}#ifndef ONLINE_JUDGE
	long _end_time = clock();
	printf("time = %ld ms.", _end_time - _begin_time);#endifreturn0;}