题目描述
有 n n n 个无区别的锁, N N N 把无区别的钥匙都被藏, M M M 个藏钥匙的地方,每个藏钥匙的地方最多藏 a i a_i ai 个钥匙,并且这个地方被发现的概率为 p i p_i pi ,求所有藏钥匙的方案能够找到至少 n n n 个的概率之和。
数据范围
所有测试数据满足 1 ≤ M ≤ 100 , 1 ≤ n ≤ N ≤ ∑ a i , 1 ≤ N , a i ≤ 1 0 9 , 1 ≤ d ≤ 1 0 7 , 0 ≤ p i < 998244353 , N ≤ 100 d , d ∣ ( a i + 1 ) 1 \leq M \leq 100,1 \leq n \leq N \leq \sum a_{i}, 1 \leq N, a_{i} \leq 10^{9}, 1 \leq d \leq 10^{7}, 0 \leq p_{i}<998244353,N \leq 100 d, d |\left(a_{i}+1\right) 1≤M≤100,1≤n≤N≤∑ai,1≤N,ai≤109,1≤d≤107,0≤pi<998244353,N≤100d,d∣(ai+1) ,但并不保证 d ∣ N d | N d∣N 或 d ∣ n d | n d∣n 。
题解
orzsz
有个关键信息是 d ∣ ( a i + 1 ) d |\left(a_{i}+1\right) d∣(ai+1) 和 N ≤ 100 d N \leq 100 d N≤100d ,所以我们可以先对每个藏钥匙的地方分配 d d d 倍的钥匙数量,然后每个位置最终只能再放 [ 0 , d ) [0,d) [0,d) 把钥匙。然后我们考虑如果我们知道了每个位置第一步分配的情况,那后面再分配的话我们需要知道被发现的位置一开始分配了多少,这样才能够去保证这些被发现的位置钥匙之和至少为 n n n 。
所以我们考虑 dp \text{dp} dp : f [ x ] [ i ] [ j ] [ k ] f[x][i][j][k] f[x][i][j][k] 表示前 x x x 个地方,有 k k k 个位置最后会被发现,这 k k k 个位置总共分配了 j × d j \times d j×d 把钥匙,这 x x x 个位置总共分配了 i × d i \times d i×d 把钥匙。转移显然。
然后假设第一步分配后还有 x x x 把钥匙没有被分配,被发现的 k k k 个位置中还差 y y y 把钥匙达到 n n n 。我们可以把这 k k k 个位置放在前面,考虑先分配 y y y 把钥匙在这 k k k 个位置上。由于 M M M 很小,且钥匙无序,所以可以枚举 u u u 表示第 y y y 把钥匙放在 u u u 上,且 y − 1 y-1 y−1 把钥匙放在了 u u u 及之前, x − y x-y x−y 把钥匙放在 u u u 及之后的位置,如果我们不考虑分配不小于 d d d ,那就可以隔板法。不小于 d d d 的话考虑容斥,可以考虑在原本 dp \text{dp} dp 的时候就进行容斥,即转移的时候考虑这个位置之后分配会不小于 d d d 的话,那就强制这个位置多选一个 d d d 容斥转移即可。这样后面再分配直接隔板就可以了。
效率: O ( m 2 × ( N d ) 2 ) O(m^2 \times (\frac{N}{d})^2) O(m2×(dN)2) 。