记忆化搜索求找 bug
查看原帖
记忆化搜索求找 bug
726525
CuteChat楼主2023/12/29 11:21
#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;
}

就第二个样例过了,应该是模数那一块出了问题。

2023/12/29 11:21
加载中...