46って出題者はおひさまなんでしょうか。
影山優佳さんサッカー詳しくていいですよね。
問題ですが、3つの整数の和が46の倍数ということは、
3つの整数それぞれの46の剰余の和も46の倍数である必要があります。
ここで3つの整数 $0 \le l,m,n \le 45$ があり、 $l+m+n$ が46の倍数であるとき、
$A_{i} = l, B_{j} = m, C_{k} = n$ となる整数の個数をそれぞれ $\acute{A_{l}}, \acute{B_{m}}, \acute{C_{n}}$ とすると、
選び方は $\acute{A_{l}} \times \acute{B_{m}} \times \acute{C_{n}}$ となります。
その計算をソースコードに落とし込んだのが以下です。
言語はC++(GCC 9.2.1)でAtCoderのコードテストで確認しています。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ll N, a;
vector<ll> A(46, 0), B(46, 0), C(46, 0);
cin >> N;
for (int i = 0; i < N; i++) {
cin >> a;
A[a % 46]++;
}
for (int i = 0; i < N; i++) {
cin >> a;
B[a % 46]++;
}
for (int i = 0; i < N; i++) {
cin >> a;
C[a % 46]++;
}
ll ans = 0;
for (int i = 0; i < 46; i++) {
if (!A[i]) continue;
for (int j = 0; j < 46; j++) {
if (!B[j]) continue;
for (int k = 0; k < 46; k++) {
if (!C[k]) continue;
if ((i + j + k) % 46 > 0) continue;
ans += A[i] * B[j] * C[k];
}
}
}
cout << ans << endl;
}