社区讨论

@tongyxt

P14074[GESP202509 五级] 有趣的数字和参与者 3已保存回复 7

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@mhj22fhb
此快照首次捕获于
2025/11/03 19:27
4 个月前
此快照最后确认于
2025/11/03 19:27
4 个月前
查看原帖
@tongyxt 不知道为什么评论不了。 关键问题分析:g数组初始化的越界访问 你的init()函数中对g数组的初始化存在严重问题:
CPP
for(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 条回复,欢迎继续交流。

正在加载回复...