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 能拿,一种两人都能拿。

双方最优的策略显然就是先拿公共的。三种数的个数可以用类似欧拉筛做。

posted @ 2026-06-14 12:11  RainyRadio  阅读(2)  评论(0)    收藏  举报