解题思路
很好的数学题
相当于去年 S 第一题难度
所以为啥比赛介绍里写的是绿标啊qwq
subtask 1
暴力
subtask 2
显然,当 k\bmod 2=0 时,答案为 0 ,否则为 1 。
简单推理即可证明。
subtask 3
容易发现,题面的意思是告诉我们用完了 a_{u_i} 和 a_{u_i-1} 就不能再用了。
所以相当于将相邻两个为 0 二进制位修改为 1 。
那么我们就得出了一个结论:将原数化为二进制后,相邻两个 1 必定是成对出现的。
直接模拟即可,时间复杂度 O(T\log x) 。
期望得分 70\text{pts} ,稍微卡卡能得满分。
subtask 4
我们发现原数除以 3 后,二进制下必定没有连续两个 1 。
我们将连续两个 1 除以 3 ,也就是二进制下的 11 时,只会两个 1 的后一位留下一个 1 ,而我们两个 1 是配对的,不可能在前面一位留下一个 1 。
我们将原数除以 3 ,然后判断即可。
时间复杂度 O(T) ,能稳过。
代码实现
其实出题组应该把实现放小点的。
但我感觉正解也只有黄的难度,到不了绿。
核心代码如下:
if(x>=1ll<<k-1){
x-=(1ll<<k-1);
if(x==0) pt
if(x%3==0){
long long x3=x/3;
if((x3&(x3<<1))==0) pt
}
}
经测试,在删去快读的情况下也能在 20\text{ms} 内通过第三个测试点。