Being stupid is hard.

发布时间 2023-08-15 20:37:15作者: liuzimingc

\(n\) 个元素分成 \(m\) 份,每份不能为空,在 \(n - 1\) 个空中插入 \(m - 1\) 个板子,方案数\(C_{n - 1} ^ {m - 1}\)

为空则加上 \(m\) 个元素来垫着,就转化为上一个,然后就是 \(C_{m - n + 1} ^ {m - 1}\)。所以为什么我之前不会插板?我是傻逼吗?

然后突然发现,之前一直以为 Games with Rectangle 是在插板,但是其实就只是因为有 \(n - 1\) 个可选,然后选出 \(2k\) 条作为矩形的长(宽类似)而已,所以我是傻逼。

然后还是不懂 Little Elephant and LCM。所以重新理一遍。

假设枚举的 \(i\) 所有因数从小到大是 \(p_1, p_2, \dots, p_m\)。那么我们只能从其中选组成 \(b\) 数组。这边为什么要枚举间隙啊?

其实是因为每个 \(a_i\) 可以放的个数是不一样的,所以要分开计算。

比如 \(a_{1 \sim i - 1}\) 可以放 \([r_{i - 1}, n]\)\(a_{1 \sim i}\) 可以放 \([r_i, n]\),那么就是 \([r_{i - 1} + 1, r_i]\) 可以放 \(i\) 个。至于直接用 lower_bound 相减只是因为这个结果刚好等于上面区间的长度。然后就是:

for (int j = 1; j <= siz - 1; j++)
	(res *= qkpow(j, pos[d[i][j]] - pos[d[i][j - 1]])) %= MOD;

这时候全部放的数量还没有统计(只到了 \(siz - 1\))。还要固定选出的最大值是枚举的 \(i\),这里其实是用的最大值 \(\leq i\) 的方案数减去最大值 \(\leq i - 1\) 的方案数,就是最大值 $ = i$ 的方案数。然后:

(res *= (qkpow(siz, n + 1 - pos[d[i][siz - 1]]) - qkpow(siz - 1, n + 1 - pos[d[i][siz - 1]]) + MOD) % MOD) %= MOD;

这里的 n + 1 - pos[d[i][siz - 1]] 是因为 lower_bound 的奇怪写法,反正就是可以放的区间长度。