题解 | #卡牌大师#

卡牌大师

https://ac.nowcoder.com/acm/contest/11181/F

题意

从1~n中选出最大的集合,使得集合中两两元素和的后缀不等于m

题解

在数轴上考虑n 设x为最小的x, 使得10x>m10^x > m

alt

然后对于每个1 ~ 10x10^x的大区间,每个数,要想得到后缀为m,会有和他对应的数,所以需要互斥选择,分为两个区间考虑

alt

显然,对于第一个区间,和第二个区间,前半段和后半段是互斥的

但他们的前半段是不互斥的, 所以我们选择前半段即可。

需要考虑的是,但区间长度为偶数时,显然区间中间的数我们时可以选择一次的,但只能选择一次,如果在其他大区间也这么选了,就会出现m的后缀

然后对于最后一个大区间,我们按nmod10xn \mod 10^x 的大小,去取数即可

参考代码

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;
}
全部评论

相关推荐

点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务