[ABC310]NAND repeatedly
思路
对于第 \(i\) 位,考虑对答案的贡献为 \(g(i)=\sum_{j=1}^i f(j,i)\)。
然后分情况讨论:
- 第 \(i\) 位是 \(0\):由于 \(0\) 或 \(1\) $ \barwedge\ 0=0$ ,所以\(g(i)=i-1\)。减一是因为 \(f(i,i)=0\)。
- 第 \(i\) 位是 \(1\):因为对于 \(1\barwedge 1=0,0\barwedge1=1\) 所以对第 \(i-1\) 位有贡献的会被全部取反,对第 \(i\) 位贡献 \(i-1-g(i-1)\) ,再加上第 \(i\) 位自我贡献 \(1\),得到 \(g(i)=i-g(i-1)\)。
Code
// 这里给出部分代码
void Solve() {
for(int i=1;i<=n;i++) {
if(!a[i]) g=i-1;
else g=i-g;
ans+=g;
}
printf("%lld\n",ans);
}

浙公网安备 33010602011771号