社区讨论
@tongyxt
P14074[GESP202509 五级] 有趣的数字和参与者 3已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @mhj22fhb
- 此快照首次捕获于
- 2025/11/03 19:27 4 个月前
- 此快照最后确认于
- 2025/11/03 19:27 4 个月前
@tongyxt 不知道为什么评论不了。
关键问题分析:g数组初始化的越界访问
你的init()函数中对g数组的初始化存在严重问题:
CPPfor(int i=0;i<N;i++){
g[i][0] = f[i-1][1]*(1<<(i-1)) + g[i-1][0] + g[i-1][1];
g[i][1] = f[i-1][0]*(1<<(i-1)) + g[i-1][1] + g[i-1][0];
}
当i=0时,代码访问了i-1 = -1,即f[-1][...]和g[-1][...],这属于数组越界访问(访问了数组定义范围外的内存)。
这种越界访问会导致:
读取 / 修改非法内存地址的数据(可能是其他变量的内存,也可能是无效值);
当数组大小N为奇数时,越界访问的内存恰好是 “可用垃圾值”,偶然让结果正确;
当N为偶数时,越界访问的内存恰好破坏了关键数据,导致结果错误。
这就是为什么你观察到 “奇数NAC,偶数NWA” 的诡异现象 —— 本质是越界访问的 “运气问题”,和奇偶性本身无关。
完整修正代码
解决思路:修正g数组的初始化逻辑,避免i=0时访问i-1,并重新定义f和g的含义(f[i][j]表示i位二进制数中 1 的个数奇偶性为j的数量,g[i][j]表示这些数的和)。
回复
共 7 条回复,欢迎继续交流。
正在加载回复...