题目背景
一年一度的综艺节目《中国好码农》又开始了。本季度,好码农由 Yazid、Zayid、小 R、大 R 四位梦想导师坐镇,他们都将组建自己的梦想战队,并率领队员向梦想发起冲击。
四位导师的派系不尽相同,节目组为了营造看点,又将导师分成了不同的阵营,与此同时对不同阵营、不同派系都作出了战队总人数限制:
- 四位导师分成两个阵营:
- Yazid、小 R 两位导师组成蓝阵营,他们两位的战队人数总和不得超过 C 0 C_0 C0。
- Zayid、大 R 两位导师组成红阵营,他们两位的战队人数总和不得超过 C 1 C_1 C1。
- 四位导师分成两个派系:
- Yazid、Zayid 两位导师属于鸭派系,他们两位的战队人数总和不得超过 D 0 D_0 D0。
- 小 R、大 R 两位导师属于 R 派系,他们两位的战队人数总和不得超过 D 1 D_1 D1。
题目描述
本季好码农邀请到了全国各路学生精英参赛。他们来自全国 c c c 个城市的 n n n 所不同学校(城市的编号从 1 1 1 至 c c c,学校的编号从 1 1 1 至 n n n)。其中,第 i i i 所学校所属的城市编号为 b i b_i bi,且共有 s i s_i si 名选手参赛。
在「题目背景」中提到的各总人数限制之外,本季度《中国好码农》的导师选择阶段有额外规则如下:
- 来自同城市的所有选手必须加入相同的阵营。
- 来自同学校的所有选手必须选择相同的导师。
对于导师,大部分学校的学生对导师没有偏好。但是有 k k k 所学校,其中每所学校的学生有且仅有一位他们不喜欢的导师。同一所学校的学生不喜欢的导师相同,他们不会加入他们不喜欢的导师的战队。
面对琳琅满目的规则和选手的偏好,作为好码农忠实观众的你想计算出,在所有选手都进行了战队选择后,战队组成共有多少种可能的局面?
- 两种战队组成的局面被认为是不同的,当且仅当在存在一所学校,使得在这两种局面中这所学校的选手加入了不同导师的战队。
- 由于答案可能很大,你只需输出可能局面数对
998
,
244
,
353
998,244,353
998,244,353 取模的结果即可。
-范围: - |测试点|
n
n
n|
c
c
c|
k
k
k|
M
M
M|
| 1 1 1| = 1 =1 =1| = n =n =n| ≤ 1 \le 1 ≤1| = 1 =1 =1|
| 2 2 2| = 10 =10 =10| = n =n =n| ≤ 10 \le 10 ≤10| ≤ 100 \le 100 ≤100|
| 3 3 3| = 20 =20 =20| = n =n =n| = 0 =0 =0| ≤ 100 \le 100 ≤100|
| 4 4 4| = 30 =30 =30| = n =n =n| = 0 =0 =0| ≤ 100 \le 100 ≤100|
| 5 5 5| = 30 =30 =30| = n =n =n| ≤ 30 \le 30 ≤30| ≤ 500 \le 500 ≤500|
| 6 6 6| = 500 =500 =500| = n =n =n| = 0 =0 =0| ≤ 1000 \le 1000 ≤1000|
| 7 7 7| = 500 =500 =500| = 30 =30 =30| = 30 = 30 =30| ≤ 1000 \le 1000 ≤1000|
| 8 8 8| = 500 =500 =500| = n =n =n| = 30 = 30 =30| ≤ 1000 \le 1000 ≤1000|
| 9 9 9| = 1000 =1000 =1000| = n =n =n| = 0 =0 =0| ≤ 2500 \le 2500 ≤2500|
| 10 10 10| = 1000 =1000 =1000| = n =n =n| = 30 =30 =30| ≤ 2500 \le 2500 ≤2500|
其中, M = max { C 0 , C 1 , D 0 , D 1 } M=\max{\left\{ C_0,C_1,D_0,D_1\right\}} M=max{C0,C1,D0,D1}。
对于所有测试点,保证 T ≤ 5 T\leq 5 T≤5。
对于所有测试点中的每一组数据,保证 c ≤ n ≤ 1000 c\leq n\leq 1000 c≤n≤1000, k ≤ 30 k\leq 30 k≤30, M ≤ 2500 M\leq 2500 M≤2500, 1 ≤ s i ≤ min { M , 10 } 1\leq s_i \leq \min\{M, 10\} 1≤si≤min{M,10}。
另外,请你注意,数据并不保证所有的 c c c 个城市都有参赛学校。
提示
十二省联考命题组温馨提醒您:
数据千万条,清空第一条。
多测不清空,爆零两行泪。
题解:
考场:
设阵营、派系分别为0、1,显然有
O
(
N
∗
M
2
)
O(N*M^{2})
O(N∗M2)的暴力:
f
[
i
]
[
j
]
[
k
]
f[i][j][k]
f[i][j][k]表示前i个人,有j个0阵营,k个0派系的方案数。转移时对于同一个城市枚举它所在的相同阵营,枚举每一个学校的派系,于是拿了50,然后一点都不会了。
正解:
考虑后面的数据范围,发现k都不大,且有一些点的k=0。考虑对于没有限制怎么优化:发现状态、转移的效率都没法减少,如果要一次同时考虑阵营和派系的限制,必须
O
(
N
∗
M
2
)
O(N*M^{2})
O(N∗M2),而分别只考虑一个,就只需
O
(
N
∗
M
)
O(N*M)
O(N∗M)。又发现阵营、派系的转移是不互相影响的,即每一种阵营的转移和每一种派系的转移结合形成的方案都是不同的,所以可以分别计算出方案数后相乘。
然后考虑剩下的k<=30的点,还是分派系和阵营考虑,但它们的转移不是互相独立的了,这时我们要使尽量多的学校能以没有限制的情况转移。考虑点的阵营限制会影响到整个城市,所以有限制的城市和无限制的城市要分开单独算;而对于点的派系限制只对自己有影响,所以只要对有限制的点和无限制的点分开算即可。于是,对于无限制的城市的所有学校计算出阵营的方案数,对于无限制的所有学校计算出派系的方案数,对于有限制的城市,枚举每个城市的阵营,对其中所有学校转移阵营方案数,对有限制的学校转移派系方案数,最后得到一个DP结果,枚举0阵营,0派系的学校数,则对于无限制的阵营、派系有一个上下边界,用前缀和计算即可。