#include <bits/stdc++.h>
using namespace std;
const int p = 998244353;
int d[63], m;
long long n, f[63][12][12][12][2][2][2][2][2][2], aaa, bbb, ccc;
long long calc(int i, int j, int k, int l, int l1, int l2, int l3, int z1, int z2, int z3) {
// j,k,l 表示三数余数,l1,l2,l3 表示是否没有放满,z1,z2,z3 表示是否不是零
if (i == m + 1) return j == 0 && k == 0 && k == 0 && z1 && z2 && z3;
if (f[i][j][k][l][l1][l2][l3][z1][z2][z3] != -1) return f[i][j][k][l][l1][l2][l3][z1][z2][z3];
long long res = 0;
for (int d1 = 0; d1 <= max(d[i], l1); ++d1)
for (int d2 = 0; d2 <= max(d[i], l2); ++d2)
for (int d3 = 0; d3 <= max(d[i], l3); ++d3)
if (((d1 ^ d2) ^ d3) == 0)
(res += calc(i + 1, (j * 2 + d1) % aaa, (k * 2 + d2) % bbb, (l * 2 + d3) % ccc, (l1 || (d1 != d[i])), (l2 || (d2 != d[i])), (l3 || (d3 != d[i])), \
(z1 || (d1)), (z2 || (d2)), (z3 || (d3)))) %= p;
return f[i][j][k][l][l1][l2][l3][z1][z2][z3] = res;
}
int main() {
scanf("%lld", &n);
for (long long i = n; i; i /= 2) d[++m] = i % 2;
for (int i = 1, j = m; i < j; ++i, --j) swap(d[i], d[j]);
scanf("%lld%lld%lld", &aaa, &bbb, &ccc);
memset(f, 255, sizeof(f));
printf("%lld\n", calc(1, 0, 0, 0, 0, 0, 0, 0, 0, 0));
return 0;
}
就第二个样例过了,应该是模数那一块出了问题。