洛谷题面传送门

又是一道我不会的代码超短的题(

一开始想着用生成函数搞,结果怎么都搞不粗来/ll

首先不妨假设音阶之间存在顺序关系,最终答案除以 \(m!\) 即可。

本题个人认为一个比较亮的地方在于,每个音阶被奏响次数都是偶数这个条件的处理方式。由于是奇偶性,我们可以发现如果我们钦定了其中 \(m-1\) 个片段对应的音阶集合,那么第 \(m\) 个片段中的音阶集合一定已经确定了。我们考虑从这个性质入手。设 \(dp_i\) 表示有多少个包含 \(i\) 个片段且符合要求的音阶集合,那么我们考虑随便钦定前 \(i-1\) 个片段的音阶。方案数 \(P(2^n-1,i-1)\),但是这样会存在某些情况不合法,不难发现不合法的情况只有可能是以下两类:

  • 第 \(i\) 个片段的音阶集合为空
  • 第 \(i\) 个片段的音阶集合与之前某个片段的音阶集合重复

考虑减去不合法的情况。对于第一种情况显然前 \(i-1\) 个音阶符合要求,方案数 \(f_{i-1}\),对于第二种情况,考虑第 \(i\) 个片段与哪个片段重复,有 \(i-1\) 种可能,再考虑剩余 \(i-2\) 个片段中有多少种方案,根据 \(f\) 的定义可知方案数为 \(f_{i-2}\),再考虑钦定第 \(i\) 个音阶的方案,由于不能为空也不能与前面 \(i-2\) 个片段重复,方案数 \(2^n-i+1\),因此

\[f_i=P(2^n-1,i-1)-f_{i-1}-f_{i-2}·(i-1)·(2^n-i+1)
\]

线性地推即可。

时间复杂度 \(\mathcal O(m)\)。

注意模数

int n,m,dp[MAXN+5],inv[MAXN+5];
int qpow(int x,int e){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
return ret;
}
int main(){
scanf("%d%d",&n,&m);int tot=qpow(2,n);
for(int i=(inv[0]=inv[1]=1)+1;i<=max(n,m);i++) inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
dp[0]=1;for(int i=1,cur=1;i<=m;i++) dp[i]=(0ll+cur-dp[i-1]-1ll*dp[i-2]*(tot-i+1+MOD)%MOD*(i-1)%MOD+MOD+MOD)%MOD,cur=1ll*cur*(tot-i)%MOD;
// for(int i=1;i<=m;i++) printf("%d\n",dp[i]);
int res=dp[m];for(int i=1;i<=m;i++) res=1ll*res*inv[i]%MOD;printf("%d\n",res);
return 0;
}

洛谷 P3214 - [HNOI2011]卡农(线性 dp)的更多相关文章

  1. P3214 [HNOI2011]卡农

    题目 P3214 [HNOI2011]卡农 在被一题容斥\(dp\)完虐之后,打算做一做集合容斥这类的题了 第一次深感HNOI的毒瘤(题做得太少了!!) 做法 求\([1,n]\)组成的集合中选\(m ...

  2. 【洛谷P1854】花店橱窗 线性dp+路径输出

    题目大意:给定 N 个数字,编号分别从 1 - N,M 个位置,N 个数字按照相对大小顺序放在 M 个位置里,每个数放在每个位置上有一个对答案的贡献值,求一种摆放方式使得贡献值最大. 题解:一道典型的 ...

  3. 【题解】洛谷P1070 道路游戏(线性DP)

    次元传送门:洛谷P1070 思路 一开始以为要用什么玄学优化 没想到O3就可以过了 我们只需要设f[i]为到时间i时的最多金币 需要倒着推回去 即当前值可以从某个点来 那么状态转移方程为: f[i]= ...

  4. 洛谷P1140 相似基因(线性DP)

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...

  5. 洛谷 P1280 尼克的任务 (线性DP)

    题意概括 线性资源分配的问题,因为空闲的时间大小看后面的时间(反正感觉这个就是个套路)所以从后往前DP. 转移方程 如果当前时刻没有工作 f[i]=f[i+1]+1 如果当前时刻有工作 f[i]=ma ...

  6. dp 洛谷P1977 出租车拼车 线性dp

    题目背景 话说小 x 有一次去参加比赛,虽然学校离比赛地点不太远,但小 x 还是想坐 出租车去.大学城的出租车总是比较另类,有“拼车”一说,也就是说,你一个人 坐车去,还是一堆人一起,总共需要支付的钱 ...

  7. 2018.07.09 洛谷P2365 任务安排(线性dp)

    P2365 任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...

  8. 洛谷P1156 垃圾陷阱【线性dp】

    题目:https://www.luogu.org/problemnew/show/P1156 题意: 每一个垃圾投放时间是t,可以堆的高度是h,如果吃掉可以增加的生命值是f. 给定g个垃圾,初始生命值 ...

  9. 洛谷P1140 相似基因【线性dp】

    题目:https://www.luogu.org/problemnew/show/P1140 题意: 给定两串基因串(只包含ATCG),在其中插入任意个‘-’使得他们匹配.(所以一共是5种字符) 这5 ...

随机推荐

  1. 初学Python-day10 函数2

    函数 1.函数也是一种数据 函数也是一种数据,可以使用变量保存 回调函数(参数的值还是一个函数) 实例: def test(): print('hello world') def test1(a): ...

  2. Hive架构及搭建方式

    目录 前言 hive的基础知识 基本架构 metastore 内嵌服务和数据库 内嵌服务 服务和数据库单独部署 hcatalog 客户端 客户端的本地模式 beeline beeline的自动模式 j ...

  3. 【UE4 C++】编程子系统 Subsystem

    概述 定义 Subsystems 是一套可以定义.自动实例化和释放的类的框架.可以将其理解为 GamePlay 级别的 Component 不支持网络赋值 4.22开始引入,4.24完善.(可以移植源 ...

  4. Gopher们写if err != nil是否腻了?

    效果 go里面没有try catch,比较类似的有panic() 和 recover()机制,但是代价太大了,他们的场景更多使用在"程序异常,无法继续往下执行了这种场景",比如配置 ...

  5. UltraSoft - Alpha - Postmortem 事后分析

    Alpha阶段 Postmortem会议 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 主要是解决DDL提醒功能的问题,定义的比较清楚,对典型用户和典 ...

  6. elasticsearch入门(简单的crud操作)

    记录一下,elasticsearch从创建索引到插入数据的一个crud操作. 一.创建索引 curl -XPUT "http://192.168.99.1:9200/productindex ...

  7. Machine learning(3-Linear Algebra Review )

    1.Matrices and vectors Matrix :Rectangular array of numbers a notation R3×3 Vector : An n×1 matrix t ...

  8. 数列极限计算中运用皮亚诺Taylor展开巧解

    这是讲义里比较精华的几个题目,今晚翻看也是想到了,总结出来(处理k/n2形式). 推广式子如下: 例题如下:

  9. 攻防世界 杂项 7.Aesop_secret

    打开发现是个gif,以为有个二维码扫一下就给flag,结果被欺骗.呜呜呜 好了,还是使用编辑器看一下吧 发现了好玩的,U2FsdGVkX19QwGkcgD0fTjZxgijRzQOGbCWALh4sR ...

  10. Spring IOC:BeanDefinition加载注册流程(转)

    BeanFactory接口体系 以DefaultListableBeanFactory为例梳理一下BeanFactory接口体系的细节 主要接口.抽象类的作用如下: BeanFactory(根据注册的 ...