社区讨论

敬重爵兰!!!

P1356数列的整除性参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo1c1ylm
此快照首次捕获于
2023/10/22 18:35
2 年前
此快照最后确认于
2023/11/02 18:57
2 年前
查看原帖
本人使用了记搜,在某个状态合法时,直接返回 11,如果最后数值 res>0res>0,那么显然是有解的。
WA30分部分代码如下:
CPP
int dfs(int u,int nw){
	if(u==n+1){
		if((nw%k+k)%k) return 0;
		return 1;
	}
	if((~mry[u][nw])) return mry[u][nw];
	int res = 0;
	res += dfs(u+1,((nw-num[u])%k+k)%k);
	res += dfs(u+1,((nw+num[u])%k+k)%k);
	mry[u][nw] = res;
	return res;
}
WA是因为 n1e4n \le 1e4,也就是说可能有很多个合法解,每个合法解贡献 11,那么最后值甚至会爆掉long long,导致判断错误。
稍微转变一下思路将有合法解就贡献 11,改成布尔值异或 11即可。
AC代码如下:
CPP
bool dfs(int u,int nw){
	if(u==n+1){
		if((nw%k+k)%k) return 0;
		return 1;
	}
	if((~mry[u][nw])) return mry[u][nw];
	bool res = 0;
	res |= dfs(u+1,((nw-num[u])%k+k)%k);
	res |= dfs(u+1,((nw+num[u])%k+k)%k);
	mry[u][nw] = res;
	return res;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...