[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);
}
posted @ 2023-07-15 22:52  ASnown  阅读(33)  评论(0)    收藏  举报