补一下最近几场的agc。
A - ><
略
B - Two Contests
略
C - Neither AB nor BA
先考虑没有 ′ C ′ 'C' ′C′的情况。注意到如果存在多对 ′ A A ′ 'AA' ′AA′或 ′ B B ′ 'BB' ′BB′且有解,随便消去一对都可以得到一组合法解。那么考虑将 2 k − 1 2k-1 2k−1和 2 k 2k 2k分一组,如果相同直接消掉,易证有解当且仅当剩下的 ′ A B ′ 'AB' ′AB′和 ′ B A ′ 'BA' ′BA′数目相同。
注意到我们可以将 ′ C ′ 'C' ′C′任意填成 ′ A ′ 'A' ′A′或 ′ B ′ 'B' ′B′。那么同样分组,易证合法当且仅当 ′ A B ′ ≤ ′ B A ′ + ′ B C ′ + ′ C A ′ + ′ C C ′ 'AB'\leq 'BA'+'BC'+'CA'+'CC' ′AB′≤′BA′+′BC′+′CA′+′CC′且 ′ B A ′ ≤ ′ A B ′ + ′ A C ′ + ′ C B ′ + ′ C C ′ 'BA'\leq 'AB'+'AC'+'CB'+'CC' ′BA′≤′AB′+′AC′+′CB′+′CC′。
注意到两个条件至多只有一个会不满足,于是可以选择计算反面情况容斥一下。以 ′ A B ′ 'AB' ′AB′为例,枚举 ′ A B ′ + ′ B A ′ + ′ B C ′ + ′ C A ′ + ′ C C ′ 'AB'+'BA'+'BC'+'CA'+'CC' ′AB′+′BA′+′BC′+′CA′+′CC′的值 k k k,那么可以变成计算一个上指标为 k k k的组合数前缀和。我们如果按 k k k的值从小往大算,可以很方便地用加法公式递推。
时间复杂度 O ( N ) \mathcal O(N) O(N)。
#include <bits/stdc++.h>
#define FR first
#define SE second
#define MOD 998244353
#