CF1935D Exam in MAC 题解
Exam in MAC
题意
给定一个大小为
求有多少对整数数对
。 且 。
数据范围
。 。 。
思路
容斥题。
求不满足两个条件的数对个数,可以转化为总数对个数减满足其中任意一个条件(即
- 总数对个数:对于
, 有 种取法;对于 , 有 种取法……总个数为 。 - 满足
的数对个数:由于 中的元素互不相同,那么只要分别处理每个 的数对个数即可。注意 ,总个数为 。 - 满足
的数对个数:同理,也只需要分别处理每个 的数对个数即可。转换式子, ,由于 ,所以 ,总个数为 。 - 满足
且 的数对个数:假设 ,推一下式子,可得 。由于 和 都是整数,则 和 都必须是偶数。易得当 和 奇偶性相同时存在数对 。很明显, 。令 为 中元素的奇数个数, 为 中元素的偶数个数,总个数为 。
记得答案要开 long long
。
复杂度
- 时间:
。 - 空间:
。
Code
点击查看代码
#include <bits/stdc++.h> using namespace std; int T, n, c, sum[2]; // sum[0] 记录偶数个数,sum[1] 记录奇数个数 long long ans; // 答案开 long long void Solve () { cin >> n >> c; ans = 1ll * (c + 2) * (c + 1) / 2; // 初始数对个数 for (int i = 1, x; i <= n; i++) { cin >> x, ans -= x / 2 + 1 + c - x + 1, sum[x % 2]++; // 减去满足任意一个条件的数对个数 } cout << ans + 1ll * (sum[0] + 1) * sum[0] / 2 + 1ll * (sum[1] + 1) * sum[1] / 2; // 加上满足两个条件的数对个数 sum[0] = sum[1] = 0; } int main () { ios::sync_with_stdio(0), cin.tie(0); for (cin >> T; T--; Solve(), cout << '\n') {} return 0; }
本文作者:wnsyou
本文链接:https://www.cnblogs.com/wnsyou-blog/p/18109392
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步