CF 比赛记录
CF2203/Edu 187
一万年前打的。
C
这个题不会也是这辈子有了。
容易想到对 \(m\) 做二进制分解,这样只有 \(2^{p_1},2^{p_2} \cdots 2^{p_n}\) 是能用的。记最高位为 \(p_1\),最低位为 \(p_n\)。那么只有 \(2^{p_n} \mid s\) 的时候才有解。
考虑接下来咋做。对 \(s\) 进行二进制分解。考虑二分答案 \(x\)。那么对应 \(s\) 与 \(m\) 的每一位,如果某一位 \(s\) 需要但 \(m\) 没有,就需要把 \(m\) 这一位的贡献下放。具体看代码:
bool check(ll x)
{
// cout << "check " << x << '\n';
ll Rem = 0;
for (ll i = 60; ~i; -- i )
{
ll A = (m >> i) & 1;
ll B = (s >> i) & 1;
if (B) ++ Rem;
if (A) Rem = max(0ll, Rem - x);
Rem <<= 1;
// if (x < 10 && i < 10) cout << i << ' ' << Rem << '\n';
}
return Rem == 0;
}
CF2203D
这个题不是弱智吗?
显然 \(b\) 中只存在三种数。一种是只有 Alice 能拿,一种只有 Bob 能拿,一种两人都能拿。
双方最优的策略显然就是先拿公共的。三种数的个数可以用类似欧拉筛做。
浙公网安备 33010602011771号