| 比赛 |
组合计数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;
}