[CSP校内集训]race(位运算?)
题意 有 \(n\) 个人,每个人有一个能力值 \(a_i\) ( \(a\) 互不相同),有 \(2^m\) 场比赛 \([0,2^m)\) ,每场比赛一个人的 得分 为 \(a_i \xor j\) ,按照得分排序,每个人获得排名 \(^2\) 的 积分 ,求每个人的积分 \(q\% (10^9+7)\) 后的异或和, \((n\leq 200000,m\leq 30)\) 思路 考场上的解法,并非最优解法qwq 由于有取模操作,只能一个个人的处理,且可以看出是要一位位的处理问题的 假设当前处理到第i个人,设 \(k_j\) 为能力值在二进制下 更高位与i一样,第j位不同 的人数,(由这个定义可知 \(\sum{k_j}=n-1\) ,即除i外的每个人会且仅会被统计一次) 暂时不管 \(k\) 怎么求,可以发现两个数之间的大小关系仅由 从高向低第一个不同的位 (即上面 \(k\) 的定义),对于一个 \(j\) ,如果第 \(j\) 位和第 \(i\) 个人一样,那么他就比不过那 \(k_j\) 个人,即排名 \(+k_j\) ,否则排名不会增加;而第 \(j\) 位是0或1的概率相等,所以第 \(i\) 个人取或不取 \(k_j\) 的概率相同,那么第 \(i\) 个人的积分为 \(0 + k_1^2 + k_2^2 +....+k_m^2 + (k_1+k_2)^2 +