跳到主要内容

数列之异或

· 阅读需 1 分钟

致敬每一个版本逆行者(指不找规律数位DP  O(log2n)DP\; O(log^2n)写过的所有人)

这道题看似很难,但就是一个找性质O(1)O(1)速秒的题

思考对于任意一个奇数与它减一,它们的二进制可以表示为ABC1ABC1和ABCD0ABCD0,这时候不管前面的位是多少,它们的异或和都是00010001

所以对于所有的数∈[1,n]\in [1,n],我们只需要考虑它可以组出多少组00010001就可以很快的找到答案了

考虑在最前面添加一个00(不会影响答案,任意数异或00还是它本身)

当nn是奇数时,恰好可以凑出n+12\frac{n+1}{2}组00010001,这时候只要考虑组数的奇偶性就行了

当nn是偶数时,可以凑出n−12\frac{n-1}{2}组00010001和一个单独的nn,同样判断奇偶性求异或和就行了

if( n&1 )
cout<<( ( ( n+1 )>>1 )&1 );
else
cout<<( n^( ( ( n+1 )>>1 )&1 ) );