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
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
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 input4 1 1 1 1output
4input
5 1 3 2 3 4output
2input
6 1 3 3 1 3 2output
1Note
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;}