ABC300 题解
0 - 写在前面
这是我打的第一场 ABC。
那时候我还是小朋友。
唉唉, 时至今日才有能力做出 然而还是不会 Ex
记得当年 _fairytale_ 和马好像都被 D 薄纱了 (?)
A - N-choice question
计算出
1 | int n, A, B; |
B - Same Map in the RPG World
发现数据范围特别小
直接暴力枚举
1 | int n, m; |
C - Cross
枚举中心点后非常容易做
1 | int n, m; |
D - AABCC
注意到
考虑复杂度为
容易发现, 直接暴力枚举
然后就做完了
注意开 __int128 (否则在剪枝的时候复杂度会爆炸)
1 | std::bitset <10000000> np; |
E - Dice Product 3
注意到这个问题存在显然的状态与转移
考虑概率dp
令
于是有
特别地,
但是这时候我们发现似乎没有办法直接计算
因为
于是到了本题最精妙的地方:
我们把
得到
注意到
事实上, 存在更高效的状态设计方式:
设
表示 用了 个, 用了 个, 用了 个 这样对于所有
, 状态都是合法的
(此处只给出记忆化搜索版本)
因为记忆化搜索好写
1 | const i64 mod = 998244353; |
F - More Holidays
首先注意一下性质: 如果可以把多个 x 全部清空, 这些被全部清空的
笼统的说, 最长的 o 串一定是
(当然, 不一定能够清空很多串, 也未必有
我们记 o 的数量为
则可以完全清空的
我们记这个数量为
则我们可以把
并将
若令
那么我们只需要考虑在 o 子串即可
考虑枚举左端点, 然后可以二分出右端点
同时我们知道, 随着左端点的右移, 右端点单调不降, 可以使用双指针法
1 | i64 n, m, k; |
G - P-smooth number
一眼容斥
但这题和 E 特别像
令
转移是显然的
设定阈值记忆化即可
1 | int primes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 }; |
- Title: ABC300 题解
- Author: rainbow-auto
- Created at : 2024-08-15 15:30:14
- Updated at : 2025-04-30 19:44:53
- Link: https://rainbow-auto.github.io/2024/08/15/ABC300-题解/
- License: This work is licensed under CC BY-NC-SA 4.0.