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)

// AOJ 1085: Spellcasters
// 2017.8.19 bal4u@uu
// 2017.11.11 

#include <stdio.h>
#include <string.h>

int c[105];

char buf[20], *p;
int getint()
{
	int n = 0;
	while (*p >= '0') n = (n<<3) + (n<<1) + (*p++ & 0xf);
	return n;
}

int main()
{
	int n, S;
	int i, j, ans;

	while (fgets(p=buf, 20, stdin) && *p != '0') {
		n = getint(), p++, S = getint();
		memset(c, 0, sizeof(c));
		for (i = 0; i < n; i++) {
			fgets(p=buf, 10, stdin);
			c[getint()]++;
		}
		for (ans = i = 0; i < S; i++) {
			if (!c[i]) continue;
			if (i + i <= S) ans += (c[i] * (c[i]-1)) >> 1;
			for (j = i + 1; j < S; j++)
				if (c[j] && i + j <= S) ans += c[i] * c[j];
		}
		printf("%d\n", n*(n-1) / 2 - ans);
	}
	return 0;
}