$$
\begin{aligned}
\sum_{i=1}^{n} \sum_{j=1}^{n} \sum_{k=1}^{n}\left(x_{i} \& x_{j}\right) *\left(x_{j} \mid x_{k}\right)
\end{aligned}
$$
$$
\begin{aligned}
=\sum_{i=1}^{n} \sum_{j=1}^{n}\left(x_{i} \& x_{j}\right) * \sum_{k=1}^{n}\left(x_{j} \mid x_{k}\right) \
\end{aligned}
$$
$$
\begin{aligned}
=\sum_{j=1}^{n}\left(\sum_{i=1}^{n}\left(x_{i} \& x_{j}\right) * \sum_{k=1}^{n}\left(x_{j} \mid x_{k}\right)\right) \
\end{aligned}
$$
$$
=\sum_{j=1}^{n} f(j) * g(j)
$$
(输入较大, 用scanf, cin超时)
这个题要将一个数字按位考虑, $ 10 = 1010 = 1_2^3 + 0_2^3 + 1_2^1 + 0_2^0 $
先分析这两个函数(f(j)和g(j)),
对于f(j)函数:
当x[j]的某一个位置为0的时候, 我们只需要统计有多少个x which 这个位置也是1. 因为1 & 1 = 1, 不然就是0
对于g(j)函数:
当x[j]的某一个位置为0的时候, 我们只需要统计有多少个x which 这个位置也是1. 因为1 | 0 = 1, 不然就是0
当x[j]的某一个位置为1的时候, 我们无需统计, 因为所有的都满足, 因为0 | 1 = 1, 并且1 | 1 = 1.
综上所述, 结果是1的位置相加就行了.
1 |
|