社区讨论
敬重爵兰!!!
P1356数列的整除性参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo1c1ylm
- 此快照首次捕获于
- 2023/10/22 18:35 2 年前
- 此快照最后确认于
- 2023/11/02 18:57 2 年前
本人使用了记搜,在某个状态合法时,直接返回 ,如果最后数值 ,那么显然是有解的。
WA30分部分代码如下:
CPPint 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是因为 ,也就是说可能有很多个合法解,每个合法解贡献 ,那么最后值甚至会爆掉long long,导致判断错误。
稍微转变一下思路将有合法解就贡献 ,改成布尔值异或 即可。
AC代码如下:
CPPbool 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 条回复,欢迎继续交流。
正在加载回复...