DTOJ 4746. 我家钥匙放在哪了

2024-03-08 23:18
文章标签 放在 钥匙 我家 dtoj 4746

本文主要是介绍DTOJ 4746. 我家钥匙放在哪了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意

张士超是你在上海音乐学院的基友,关系非常好。你们在五角场附件合租了一间屋子。由于你那么有钱,一下买了 n n n 把相同的锁,并一下配了 N N N 把相同的钥匙。你用这些锁并联锁住你家的大门,需要同时插入 n n n 把钥匙才能打开。

一天晚上,张士超带着华师大的姑娘去了闵行。而且还把你们的 N N N 把钥匙全部藏在了一些奇怪的地方。

张士超有 M M M 个可能的地方来藏钥匙,比如地毯,花园,或门口大爷。每处藏匿位置至多可容纳 a i a_i ai 把钥匙,并且有 p i p_i pi 的独立概率被你找到。当然如果一个位置被你找到了,你就会拿到这里的所有钥匙。你必须至少拿到其中 n n n 把钥匙才能回家。

假设张士超按所有合法方案中的任何一种方案放钥匙的概率相同。现在你希望算出你可以找到钥匙顺利回家的概率,如果这个概率太小,就干脆打车跑到闵行去把张士超痛扁一顿。

张士超在闵行乐不思蜀,你却在五角场无家可归。你必须在2s内算出答案,否则就会在寒风凛冽的国定路被冻死。

998244353 998244353 998244353 取模。为避免除法可能出现的问题,请输出答案乘上合法方案总数的积,即放钥匙的所有方案中能回家的概率之和。合法方案即一个数组 0 ≤ b i ≤ a i 0 \le b_i \le a_i 0biai 满足 0 ≤ b i ≤ a i , ∑ i b i = N 0 \leq b_{i} \leq a_{i}, \sum_{i} b_{i}=N 0biai,ibi=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<998244353N100d,d(ai+1),但并不保证 d ∣ N d | N dN d ∣ n d | n dn

Other Constraints M , N M,N M,N P o i n t s Points Points
a i ≤ 10 a_i \le 10 ai10 M ≤ 6 M \le 6 M610
n = 1 n=1 n=1 n = N n=N n=N N ≤ 100 N \le 100 N1005
n = 1 n=1 n=1 n = N n=N n=N15
p i ∈ { 0 , 1 } p_{i} \in\{0,1\} pi{0,1} N ≤ 100 N \le 100 N1005
p i ∈ { 0 , 1 } p_{i} \in\{0,1\} pi{0,1}15
No More Constraints N ≤ 100 N \le 100 N10030
No More Constraints20

题解

注意到 N ≤ 100 d N\le100d N100d,考虑每个位置先选若干个 d d d,最后把剩下的分给每个位置,要求每个位置少于 d d d。考虑 n n n的限制,如果概率都是 0 0 0 1 1 1,即在 p = 1 p=1 p=1位置要放的数总和不少于 n n n;考虑把每一种可能性以概率的积的形式记在DP中,先DP出总共放了 i i i d d d,在选的位置放了 j j j d d d,选了 k k k个位置的概率总和。

剩下的问题在于把 x x x个数放到 M M M个位置,每个位置小于 d d d,前 k k k个位置放不少于 y y y个。考虑后者,由于 M M M较小,考虑枚举第 y y y个数在哪个位置,再乘上组合数即可。对于前者,在DP的时候直接容斥,即当前的位置若选了不少于 d d d个就 ∗ − 1 *-1 1。这样就做完了,效率为 O ( n 4 ) O(n^{4}) O(n4)

这篇关于DTOJ 4746. 我家钥匙放在哪了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/788742

相关文章

模拟退火判断一个圆是否可以放在一个多边形内

/*给定n个点的一个多边形,一个圆的半径,判断圆是否可以放在多边形里*//* ***********************************************Author :rabbitCreated Time :2014/7/3 22:46:38File Name :2.cpp**********************************************

【Http 每日一问,访问服务端的鉴权Token放在header还是cookie更合适?】

结论先行: token静态的,不变的,放在header里面。 典型场景 ,每次访问时需要带个静态token请求服务端,向服务端表明是谁请求,此时token也可以认为是个固定的access-key。token动态的,会失效,放在cookie里面。 典型场景,业务登录态token,存在有效期的,过一段时间可能会失效。 下面具体展开下。 在选择将鉴权 Token 放在 HTTP Header 还是

Maven打包SpringBoot项目(将第三方依赖jar包和配置文件放在外部进行管理)_the_bud的博客-CSDN博客

原文链接   Maven打包SpringBoot项目(将第三方依赖jar包和配置文件放在外部进行管理) Maven打包SpringBoot项目(将第三方依赖jar包和配置文件放在外部进行管理) BIG_FISH1 2020-04-28 11:41:27 2887 收藏 3 分类专栏: IDEA 文章标签: maven [spring boot](https://so.csdn.net

阿里面试题,为什么wait()方法要放在同步块中?

点击上方“朱小厮的博客”,选择“设为星标” 后台回复”加群“加入公众号专属技术群 某天我在***的时候,突然有个小伙伴微信上说:“哥,阿里面试又又挂了,被问到为什么wait()方法要放在同步块中,没答出来!” 我顿时觉得**一紧,仔细回顾一下,如果wait()方法不在同步块中,代码的确会抛出异常: public class WaitInSyncBlockTest { @Test public

macos 一直弹出 “git-credential-osxkeychain”想要访问你的钥匙串中的密钥“github.com” 解决方法

macos 一直弹出 “git-credential-osxkeychain”想要访问你的钥匙串中的密钥“github.com” 解决方法 现在网络上关于这个问题的解决方案大部分都是打开钥匙串访问,然后删除github的密钥,但是这个方法其实并不奏效。具体的解决方法如下(二选一即可) 方法一 使用GitHub CLI 首先,使用brew安装GitHub CLI: brew install

js-输出当前索引(放在属性里面)

若要是直接在数组遍历时输出,不论点击哪个,则都出i的最大值,即数组的长度。所以 将索引放在属性里面; <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>tab栏封装</title><style>body,ul{padding: 0;margin: 0;}ul{list-style: none;}.tab{

设置环境变量时,export只对当前登录bash登录session有用,放在内存中。

Linux中使用export命令设置环境变量 举报|2010-09-04 15:08 qijidechuxian  |  浏览 71590 次   操作系统 例如在终端控制台输入:export TEST_ENV='test_enviroment',这时候就添加了TEST_ENV这一环境变量,通过命令:env | grep TEST_ENV能够查到,而且 echo $TEST_ENV的

探索数据世界的钥匙:机器学习中的线性回归

在浩瀚的数据海洋中,寻找隐藏的模式与规律,一直是科学家、工程师乃至各行各业决策者们的共同追求。而机器学习,作为这一领域的璀璨明珠,以其强大的数据分析与预测能力,正逐步改变着我们的世界。在众多机器学习算法中,线性回归以其简洁、直观、易于理解的特点,成为了入门机器学习的首选,更是解决回归问题的一把金钥匙。 一、线性回归:定义与原理 线性回归,顾名思义,是一种通过线性模型来预测一个或多个自变量(

“解锁进程间高效沟通,Linux IPC是你的关键钥匙!“#Linux系统编程之进程间通信【下】

"解锁进程间高效沟通,Linux IPC是你的关键钥匙!"#Linux系统编程之进程间通信【下】 前言预备知识一、 共享内存概述1.1 共享内存概述简图 二、 共享内存编程实战2.1 共享内存介绍2.1.1 共享内存的特点 2.2 共享内存几个重要API介绍2.2.1 shmget函数介绍2.2.2 shmat函数介绍2.2.3 shmdt函数介绍2.2.4 shmctl函数介绍 2.3 共

asp.net将后台代码放在页面上

将后台的cs代码转移到页面上主要是做如下操作:   1.去掉aspx头Page部分的CodeFile属性,这个属性指示了页面的后台文件的文件名.   2.在Page中添加Inherits属性,这个属性的值是页面后台文件的父类,如果页面的父类 是System.Web.UI.Page,那么可以不加这个属性.   3.将后台代码所使用的名字空间添加到aspx的头,使用<%@ Import Namespa