0%

Educational Codeforces Round 187 (Rated for Div. 2)-CF-Edu-187-C. Test Generator(从低位到高位贪心考虑)

题目大意

题目描述
给定两个整数 ssmm
你需要构造一个由非负整数组成的数组 a=[a1,a2,,an]a=[a_1, a_2, \dots, a_n],满足以下两个条件:

  1. 数组所有元素的和等于 ss,即 i=1nai=s\sum_{i=1}^n a_i = s

  2. 对于数组中的每一个元素 aia_i,都满足 ai & m=aia_i \ \& \ m = a_i(其中 &\& 表示按位与运算符)。换句话说,在每个数字 aia_i 的二进制表示中,只有当 mm 在相应位置上的二进制位也是 11 时,aia_i 在该位置上的二进制位才可以是 11

判断是否至少存在一个满足条件的数组。如果存在,求出该数组的最小可能长度 nn;如果不存在,则输出 1-1

输入格式
第一行包含一个整数 tt1t1041 \le t \le 10^4),表示测试用例的数量。
每个测试用例包含一行,包含两个整数 ssmm1s,m10181 \le s, m \le 10^{18})。

输出格式
对于每个测试用例,输出一个整数:
如果不存在这样的数组,输出 1-1
否则,输出满足条件的数组的最小可能长度 nn

样例输入

1
2
3
4
5
6
7
6
13 5
13 3
13 6
1000000007 2776648
99999999999 1
998244353 1557287

样例输出

1
2
3
4
5
6
3
5
-1
-1
99999999999
642

样例解释
对于部分测试用例的分析如下:
s=13,m=5s=13, m=5 时,答案为 33,因为存在一个满足条件的数组 a=[5,4,4]a=[5, 4, 4]
s=13,m=3s=13, m=3 时,答案为 55,因为存在一个满足条件的数组 a=[3,3,3,3,1]a=[3, 3, 3, 3, 1]
s=13,m=6s=13, m=6 时,答案为 1-1,因为不存在满足条件的数组。

思路讲解

说白了就是从高位到低位贪心,因为高位你也没办法减的更多了,高位只能影响更高位,而更高位之前已经尽力解决了。因此没有后效性。

1
2
3
4
5
6
7
8
9
10
11
12
13
auto check=[&](ll num_a) -> bool {
ll opS=S;
for (ll i=62;i>=0;--i) {
if ((M>>i)&1) {
ll cnt=opS/(1ll<<i);
opS-=min(cnt,num_a)*(1ll<<i);
}
}
if (opS==0) {
return true;
}
return false;
};

AC代码

AC
https://codeforces.com/contest/2203/submission/364386484

心路历程(WA,TLE,MLE……)