#4746. 我家钥匙放在哪了

题目描述

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) 1M100,1nNai,1N,ai109,1d107,0pi<998244353,N100d,d(ai+1) ,但并不保证 d ∣ N d | N dN d ∣ n d | n dn

题解

orzsz

有个关键信息是 d ∣ ( a i + 1 ) d |\left(a_{i}+1\right) d(ai+1) N ≤ 100 d N \leq 100 d N100d ,所以我们可以先对每个藏钥匙的地方分配 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 y1 把钥匙放在了 u u u 及之前, x − y x-y xy 把钥匙放在 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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值