比赛 组合计数1 评测结果 WTTTTTTTTW
题目名称 方案数 最终得分 0
用户昵称 LikableP 运行时间 8.994 s
代码语言 C++ 内存使用 13.21 MiB
提交时间 2026-02-26 11:59:08
显示代码纯文本
#include <cstdio>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
typedef long long ll;

const ll MOD = 998244353LL;

template <class T1, class T2>
struct std::tr1::hash<std::pair<T1, T2>> {
  size_t operator()(std::pair<T1, T2> pair) const {
    std::tr1::hash<T1> H1;
    std::tr1::hash<T2> H2;
    return H1(pair.first) ^ H2(pair.second);
  }
};

bool getbit(ll x, int pos) {
  return x >> pos & 1LL;
}

ll delbit(ll x, int pos) {
  return x ^ (1LL << pos);
}

ll n, m, r, o;
__gnu_pbds::gp_hash_table<std::pair<ll, std::pair<ll, ll>>, ll> map;
__gnu_pbds::gp_hash_table<std::pair<ll, std::pair<ll, ll>>, bool> obstacle;

ll dfs(ll x, ll y, ll z) {
  std::pair<ll, std::pair<ll, ll>> pair = {x, {y, z}};
  if (x < 0LL || y < 0LL || z < 0LL || x > n || y > m || z > r) return 0LL;
  if (obstacle.find(pair) != obstacle.end()) return 0LL;

  if (x == 0LL && y == 0LL && z == 0LL) return map[pair] = 1LL;
  if (map.find(pair) != map.end()) return map[pair];

  for (int i = 0; i <= 60; ++i) {
    if (getbit(x, i)) (map[pair] += dfs(delbit(x, i), y, z)) %= MOD;
    if (getbit(y, i)) (map[pair] += dfs(x, delbit(y, i), z)) %= MOD;
    if (getbit(z, i)) (map[pair] += dfs(x, y, delbit(z, i))) %= MOD;
  }

  return map[pair];
}

int main() {
  #ifdef LOCAL
    freopen("!input.in", "r", stdin);
    freopen("!output.out", "w", stdout);
  #else
    freopen("problema.in", "r", stdin);
    freopen("problema.out", "w", stdout);
  #endif

  scanf("%lld %lld %lld", &n, &m, &r);
  scanf("%lld", &o);
  for (ll x, y, z, i = 1LL; i <= o; ++i) {
    scanf("%lld %lld %lld", &x, &y, &z);
    map[{x, {y, z}}] = true;
  }
  
  printf("%lld\n", dfs(n, m, r));
  return 0; 
}