如果你不在计算过程中取模,可能会爆 long long。
我只在计算出结果后取模,导致大部分测试点都 RE 了,我还以为是数组开小了调了半天。最后发现是因为计算出负数,导致异或之后的结果出了大问题,直接数组越界了。
如果你取模了还是错,要注意:计算过程中如果有减法,取模之后可能出现减数大于被减数的情况,会出现负数,这时需要通过取模将负数变成正数:
我的 40 分代码的错误之处:
ll sd(int l, int r) { return pd[r] - pd[l - 1]; }
ll sdd(int l, int r) { return pdd[r] - pdd[l - 1]; }
这样改之后,变成了 100 分:
ll sd(int l, int r) { return (((pd[r] - pd[l - 1]) % mod) + mod) % mod; }
ll sdd(int l, int r) { return (((pdd[r] - pdd[l - 1]) % mod) + mod) % mod; }