洛谷题面传送门

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

一开始想着用生成函数搞,结果怎么都搞不粗来/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. Scrum Meeting 0609

    零.说明 日期:2021-6-9 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 完成前端功能 ...

  2. 热身训练4 Article

    Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...

  3. 关于QGIS的插件开发(C++)

    关于C++插件的开发材料较少,根据网上的指导,我采用了早期版本的插件模板生成的方法来创建QGIS的插件,其方法是从以前版本(2.18.25)里面拷贝插件模板的方法进行,具体的执行步骤为 1.拷贝文件 ...

  4. 洛谷 P5665 [CSP-S2019] 划分

    链接: P5665 题意: 给出 \(n\) 个整数 \(a_i\) ,你需要找到一些分界点 \(1 \leq k_1 \lt k_2 \lt \cdots \lt k_p \lt n\),使得 \( ...

  5. uvm中类继承和phase

    1,uvm中类继承关系如下所示 2,uvm中phase如下所示

  6. insertion-sort-list leetcode C++

    Sort a linked list using insertion sort. C++ /** * Definition for singly-linked list. * struct ListN ...

  7. Codeforces Round #735 (Div. 2)

    这次的cf依旧掉分..... A题和B题在不懈死磕下瞎搞出来了,不过还是被C题卡住了... C. Mikasa 简述题意就是给定n和m,让n^0,n^1,n^2...,n^m,求着m+1个数中没有出现 ...

  8. hdu 2189 来生一起走(DP)

    题意: 有N个志愿者.指挥部需要将他们分成若干组,但要求每个组的人数必须为素数.问不同的方案总共有多少.(N个志愿者无差别,即每个组的惟一标识是:人数) 思路: 假设N个人可分为K组,将这K组的人数从 ...

  9. MySQL 默认隔离级别是RR,为什么阿里这种大厂会改成RC?

    我之前写过一篇文章<为什么MySQL选择REPEATABLE READ作为默认隔离级别?>介绍过MySQL 的默认隔离级别是 Repeatable Reads以及背后的原因. 主要是因为M ...

  10. TCP粘"包"问题浅析及解决方案Golang代码实现

    一.粘"包"问题简介 在socket网络编程中,都是端到端通信,客户端端口+客户端IP+服务端端口+服务端IP+传输协议就组成一个可以唯一可以明确的标识一条连接.在TCP的sock ...