\(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 的奇怪写法,反正就是可以放的区间长度。