Problem:
Score : 400 points

Problem Statement

We have N balls. The i-th ball has an integer A_i written on it.

For each k=1, 2, ..., N, solve the following problem and print the answer.

Find the number of ways to choose two distinct balls (disregarding order) from the N-1 balls other than the k-th ball so that the integers written on them are equal.

Constraints

3 \leq N \leq 2 \times 10^5

1 \leq A_i \leq N

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

For each k=1,2,...,N, print a line containing the answer.

Sample Input 1

5
1 1 2 1 2

Sample Output 1

2
2
3
2
3

Consider the case k=1 for example. The numbers written on the remaining balls are 1,2,1,2.

From these balls, there are two ways to choose two distinct balls so that the integers written on them are equal.

Thus, the answer for k=1 is 2.

Sample Input 2

4
1 2 3 4

Sample Output 2

0
0
0
0

No two balls have equal numbers written on them.

Sample Input 3

5
3 3 3 3 3

Sample Output 3

6
6
6
6
6

Any two balls have equal numbers written on them.

Sample Input 4

8
1 2 1 4 2 1 4 1

Sample Output 4

5
7
5
7
7
5
7
5

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)


import java.util.*;

/*
ボールが N個あり、 i番目のボールには整数 
Aiが書かれています。
k=1,2,...,N
 に対して以下の問題を解いて、答えをそれぞれ出力してください。

k 番目のボールを除いた 
N−1 個のボールから、書かれている整数が等しいような異なる 
2 つのボールを選び出す方法の数を求めてください。選ぶ順序は考慮しません。
*/



public class Main {
    public static void main(final String[] args){
        //スキャン
        final Scanner s = new Scanner(System.in);
        int N = s.nextInt();
        HashMap<Integer,Long> counter = new HashMap<>();
        List<Integer> list = new ArrayList<Integer>();
        final int[] As = new int[N];
        for(int i = 0;i<=N-1;i++){
            As[i] = s.nextInt();
            if(!list.contains(As[i])){
                //重複記録簿に追加
                list.add(As[i]);
                //重複数を数え始める
                counter.put(As[i], (long) 1);
            }else{
                counter.put(As[i],counter.get(As[i])+1);
            }
        }
        s.close();
        
        //全組み合わせ計算
        //ｋの選択パターンを網羅
        for(int k = 0;k<=N-1;k++){
            Long allnum =0L;
            //選ばれたkと同じ値は減衰させる
            if(list.contains(As[k])){
                counter.put(As[k],counter.get(As[k]--));
            }
            //全組み合わせ数計算
            for(int i =0;i<=list.size()-1;i++){
                Long param = counter.get(list.get(i));
                allnum += param*(param-1)/2;
            }
            System.out.println(allnum);
            allnum =0L;
        }
        
    
    }
}