#include #pragma GCC target("avx2") #define rep(i, a, b) for (ll i = (a); i < (b); i++) #define all(x) (x).begin(), (x).end() #define sz(x) (ll)size(x) using namespace std; using ll = long long; using vi = vector; using vvi = vector; using pii = pair; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); void solve() { ll n; cin >> n; array, 22>, 22> label; rep(x, 0, n) { char gah; cin >> gah; rep(y, 0, n) rep(z, 0, n) cin >> label[x][y][z]; } array, 2809>, 45>, 45>, 45> airplanes; tuple null_vec = {0, 0, 0}; rep(dx, -n, n+1) rep(dy, -n, n+1) rep(dz, -n, n+1) if (abs(gcd(dz, gcd(dx, dy))) == 1 && tuple(dx, dy, dz) < null_vec) { rep(px, 0, n) rep(py, 0, n) rep(pz, 0, n) { ll prod = dx * px + dy * py + dz * pz; if (label[px][py][pz] == 'C') { airplanes[dx + 22][dy + 22][dz + 22][prod + 1404].second++; } if (label[px][py][pz] == 'B') { airplanes[dx + 22][dy + 22][dz + 22][prod + 1404].first++; } //airplanes[make_tuple(dx, dy, dz, prod)].second += label[px][py][pz] == 'C'; //airplanes[make_tuple(dx, dy, dz, prod)].first += label[px][py][pz] == 'B'; } } ll ans = 0; rep(px1, 0, n) rep(py1, 0, n) rep(pz1, 0, n) if (label[px1][py1][pz1] == 'A') { rep(px2, 0, n) rep(py2, 0, n) rep(pz2, 0, n) if (label[px2][py2][pz2] == 'P') { ll dx = px1 - px2; ll dy = py1 - py2; ll dz = pz1 - pz2; ll g = abs(gcd(dz, gcd(dx, dy))); dx /= g; dy /= g; dz /= g; if (tuple(dx, dy, dz) > null_vec) { dx = -dx; dy = -dy; dz = -dz; } ll prod1 = dx * px1 + dy * py1 + dz * pz1; ll prod2 = dx * px2 + dy * py2 + dz * pz2; ans += airplanes[dx + 22][dy + 22][dz + 22][prod1 + 1404].first * airplanes[dx + 22][dy + 22][dz + 22][prod2 + 1404].second; } } cout << ans << endl; } int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); solve(); return 0; }