Educational Codeforces Round 23 B. Makes And The Product

雨点打透心脏的1/2处 2022-06-14 09:53 283阅读 0赞

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 a**i·a**j·a**k 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 numbers a**i (1 ≤ a**i ≤ 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 a**i·a**j·a**k is minimum possible.

Examples

input

  1. 4
  2. 1 1 1 1

output

  1. 4

input

  1. 5
  2. 1 3 2 3 4

output

  1. 2

input

  1. 6
  2. 1 3 3 1 3 2

output

  1. 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.

题目意思:

就是给定N个数,然后按大小顺序排序后,找前三个数,问有多少种不同的组合。

如果是 6

1 1 2 2 3 3

的话前三个数,是1,1,2然后2有两个可以替换,所以是2种情况。以此类推

如果都是一个数的话,那么就是排列组合。

要用LLD才行

  1. #include<bits/stdc++.h>
  2. #include<iostream>
  3. using namespace std;
  4. int number[100005];
  5. int main()
  6. {
  7. int n;
  8. long long int all = 1;
  9. scanf("%d",&n);
  10. for(int i = 0; i < n; i++)
  11. {
  12. scanf("%d",&number[i]);
  13. }
  14. sort(number,number+n);
  15. int count = 1,index = 1;
  16. while(number[index] == number[0] && index < n)
  17. {
  18. index++;
  19. count++;
  20. }
  21. if(count >= 3)
  22. {
  23. all=all*index;
  24. all=all*(index-1);
  25. all=all*(index-2);
  26. all=all/6;
  27. }
  28. else if(count == 2)
  29. {
  30. for(int i = 3; i < n; i++)
  31. if(number[i] == number[2])
  32. all++;
  33. }
  34. else
  35. {
  36. int k = 3;
  37. while(k<n&&(number[k]==number[2]))
  38. k++;
  39. k--;
  40. if(number[1] == number[2])
  41. {
  42. all=k;
  43. all=all*(k-1);
  44. all=all/2;
  45. }
  46. else
  47. {
  48. all=all+(k-2);
  49. }
  50. }
  51. printf("%lld\n",all);
  52. return 0;
  53. }

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读