Problem:
Problem B: Spellcasters

n 人の魔法使いがいる。彼らには 1 から n までの番号があり、i 番目の魔法使いは魔力 ri ( 1 ≤ i ≤ n ) を持っている。いま彼らは強力な魔法使いと対峙しており、その敵の魔力は S である。n 人の魔法使いは協力して戦うのが得意で、特に 2 人で協力して戦うことを好む。2 人の魔法使いが協力した場合、魔力は単純にその和となり、強力な魔法などを駆使してある程度強い敵にも勝てるようになる。あなたの仕事は魔力 S を持つ敵に対して勝つことができる魔法使いのペア (i, j) ( i ≠ j かつ 1 ≤ i ≤ n かつ 1 ≤ j ≤ n ) の総数を出力することである。ただし (i, j) と (j, i) は同じ組として数える。一方の魔力が他方の魔力よりも大きいとき、大きい魔力を持っている側が勝つ。等しい場合は相打ちで勝ったことにならない。

Input

入力は複数のテストケースからなる。 各テストケースは以下の形式に従う。

n S
r1
r2
…
rn

各変数の意味は問題文中の通りである。
入力の終わりは、ふたつの0が一文字の空白で区切られる一行で示される。

Constraints

入力はすべて整数

1 ≤ n ≤ 20,000

1 ≤ ri ≤ 100 ( 1 ≤ i ≤ n )

1 ≤ S ≤ 100

テストケースの数は 100 を超えない。

Output

条件を満たす組 (i, j) (i ≠ j) の総数を各ケースに付き 1 行に出力せよ。

Sample Input

3 7
1
3
10
0 0

Sample Output

2

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;

namespace AOJ
{
    class _1085
    {
	    static void Main()
	    {
		    while(true){
			    string [] tokens = Console.ReadLine().Split(' ');
			    var n = int.Parse(tokens[0]);
			    var S = int.Parse(tokens[1]);
			    int res = 0;
			    
			    if( n == 0 && S == 0 ) break;
                
                int [] x = new int[n];
                for(int i = 0; i < n; ++i){
				    x[i] = int.Parse(Console.ReadLine());
			    }
                Array.Sort(x);
                
			    for(int i = 0; i < n; ++i){
                    int p = Array.BinarySearch(x, S+1 - x[i]);
                    while (p > 0 && x[p - 1] == S + 1 - x[i]) --p;
                    if (p < 0) p = ~p;
                    // Console.WriteLine("Search : {0}, Result : {1}", S + 1 - x[i], p);
                    res += n - Math.Max(i+1,p);
			    }
			    Console.WriteLine("{0}", res);
		    }
	    }
    }
}