1+ <!-- 以下は **PHP 8.2.8** に対応した解答です。
2+ 時間計算量 `O(N)`・空間計算量 `O(100)` で、**最大入力サイズ N = 200,000 に対しても高速**に動作します。
3+
4+ ---
5+
6+ ## ✅ アルゴリズムの概要
7+
8+ * 各要素 `A[i]` の `A[i] % 100` の回数をカウント
9+ * 組 `(i, j)` が `(A[i] + A[j]) % 100 == 0` を満たすのは:
10+
11+ * `(0, 0)`, `(50, 50)`:→ `nC2`(同じ余りの中から2つ選ぶ)
12+ * `(r, 100 - r)`:→ `count[r] * count[100 - r]`(r=1〜49)
13+
14+ ---
15+
16+ ## ✅ PHP 実装(型付きコメントつき)
17+
18+ ```php -->
19+ <?php
20+
21+ /**
22+ * 条件を満たす (i, j) のペア数を返す
23+ *
24+ * @param int $n 配列の長さ
25+ * @param array<int> $a 整数配列(長さ $n)
26+ * @return int 条件を満たすペアの数
27+ */
28+ function countDivisiblePairs (int $ n , array $ a ): int
29+ {
30+ /** @var array<int> $modCount mod 100 の出現回数を格納 */
31+ $ modCount = array_fill (0 , 100 , 0 );
32+
33+ // A[i] % 100 の頻度をカウント
34+ foreach ($ a as $ value ) {
35+ $ mod = $ value % 100 ;
36+ $ modCount [$ mod ]++;
37+ }
38+
39+ $ result = 0 ;
40+
41+ // mod=0 のペア (C(n, 2))
42+ $ result += intdiv ($ modCount [0 ] * ($ modCount [0 ] - 1 ), 2 );
43+
44+ // mod=50 のペア
45+ $ result += intdiv ($ modCount [50 ] * ($ modCount [50 ] - 1 ), 2 );
46+
47+ // mod=r, 100-r のペア (r=1〜49)
48+ for ($ r = 1 ; $ r < 50 ; $ r ++) {
49+ $ result += $ modCount [$ r ] * $ modCount [100 - $ r ];
50+ }
51+
52+ return $ result ;
53+ }
54+
55+ // ----------- 入出力処理 ------------
56+ $ input = trim (stream_get_contents (STDIN ));
57+ $ tokens = preg_split ('/\s+/ ' , $ input );
58+ $ n = (int )array_shift ($ tokens );
59+ $ a = array_map ('intval ' , $ tokens );
60+
61+ // 結果出力
62+ echo countDivisiblePairs ($ n , $ a ) . PHP_EOL ;
63+ // ```
64+
65+ // ---
66+
67+ // ## ✅ 実行方法
68+
69+ // ファイル名を `main.php` とした場合:
70+
71+ // ```bash
72+ // php main.php < input.txt
73+ // ```
74+
75+ // ---
76+
77+ // ## ✅ 処理時間・メモリ量
78+
79+ // * **時間計算量:** `O(N)`(配列走査+mod集計)
80+ // * **空間計算量:** `O(100)`(固定配列1つ)→ 約数KB
81+
82+ // メモリ制限:**1024 MiB** 以内に大幅な余裕あり
83+
84+ // ---
85+
86+ // ## ✅ 入力例と出力例
87+
88+ // ### 入力:
89+
90+ // ```
91+ // 9
92+ // 10 20 30 40 50 60 70 80 90
93+ // ```
94+
95+ // ### 出力:
96+
97+ // ```
98+ // 4
99+ // ```
100+
101+ // ---
102+
103+ // 必要であれば、テスト用の `input.txt` や `unittest` の形式もお渡しできます。どうしますか?
0 commit comments