题解 | #卡牌大师#
卡牌大师
https://ac.nowcoder.com/acm/contest/11181/F
题意
从1~n中选出最大的集合,使得集合中两两元素和的后缀不等于m
题解
在数轴上考虑n 设x为最小的x, 使得
然后对于每个1 ~ 的大区间,每个数,要想得到后缀为m,会有和他对应的数,所以需要互斥选择,分为两个区间考虑
显然,对于第一个区间,和第二个区间,前半段和后半段是互斥的
但他们的前半段是不互斥的, 所以我们选择前半段即可。
需要考虑的是,但区间长度为偶数时,显然区间中间的数我们时可以选择一次的,但只能选择一次,如果在其他大区间也这么选了,就会出现m的后缀
然后对于最后一个大区间,我们按 的大小,去取数即可
void solve() {
ll n, m; cin >> n >> m;
__int128_t pw = 1;
while (pw <= m) pw *= 10;
ll cnt = n / pw;
n %= pw;
ll part1 = (m - 1) / 2;
ll ans = part1 * cnt + min(n, part1) + (!(m & 1) and (cnt or n > part1));
n -= m - 1; cmax(n, 0ll);
ll part2 = (pw - m + 1) / 2;
ans += part2 * cnt + min(n, part2) + (!(m & 1) and (cnt or n > part2));
cout << ans << endl;
}