题目
求∑1≤j≤i≤na[j]xora[j+1]xor…xora[i−1]xora[i]\sum_{1\leq j\leq i\leq n}a[j] xor a[j+1]xor\dots xor a[i-1] xor a[i]1≤j≤i≤n∑a[j]xora[j+1]xor…xora[i−1]xora[i]
分析
把二进制位分开讨论,设dp[t]dp[t]dp[t]表示二进制第ttt位的答案,若xxx的第ttt位为0,那么不会影响答案,仍然保留,若为1时,答案会是原来的取反,所以dp[t]=x−dp[t]dp[t]=x-dp[t]dp[t]=x−dp[t],然后答案是∑dp[t]∗2t\sum dp[t]*2^t∑dp[t]∗2t
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
int n,dp[31]; long long ans;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i){
rr int x=iut();
for (rr int j=30;~j;--j){
if (x&(1<<j)) dp[j]=i-dp[j];
ans+=(1ll<<j)*dp[j];
}
}
return !printf("%lld",ans);
}