卡农 -- HNOI2011 -- DP&组合
卡农 -- \(HNOI2011\)
题意
给定一个 集合 $ A= { 1 \le x \le n | x } $ , 求出其 \(m\) 个不相同的且不为空集的子集,使得第 \(i\) 个元素的在所有选出的子集中出现的次数 \(appear_i \mod 2 = 0\)
题解
首先一个已知结论:
对于一个 \(A\) 这样的集合,他不同的子集个数为 \(2^n\)
那么这时我们减去空集,那么可选的为 \(2^n - 1\) 种。
你影响你最后的每个元素的出现次数的是第 \(m\) 次的选择。
若第 \(i\) 个数在前 \(m - 1\) 个子集中出现的次数为奇数,那么 \(i\) 在最后一个中必定出现。
反之就不会出现。
所以 前 \(m - 1\) 个怎么取值都行。
考虑此时 \(ans_m\) 为 \(m\) 个子集满足条件的方案数。
不考虑什么奇偶,前 \(m - 1\) 个能选的总方案数为 :
\]
第一种情况:若 \(1 \dots n\) 在前 \(m - 1\) 个子集中出现的次数均为偶数,则此时末尾为空集,显然不可取,所以:
\]
第二种情况:若所有出现次数为奇数的数构成的集合 \(B\) 已经被选入,则:
\]
解释一下:
那么我们可以看做就是最后一个集合 \(=\) 第 \(m - 1\) 个集合
那前 \(m - 2\) 个肯定是符合要求的。那肯定前 \(m - 2\) 个是不重叠的那这个重叠的集合的取值种数为 $2 ^ n - 1 - (m - 1) $
最后的处理,现在定义 \(n = 2, m = 3\)
那对于这三种选法,会算成三种,但实际是一种
\]
\]
\]
注意对于前面 $ 2 $ 个集合的来说它的选择的顺序是没关系的。算成三种的原因只是因为最后的一个集合的抠出来的值不同。
所以再除以一个 $ m $
所以 \(DP\) 转移方程为:
\]
\(code\)
格式化过的
点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std ;
const int N = 1e6 + 1 ;
int dp[ N ], C[ N ] ;
const long long mod = 1e8 + 7 ;
namespace Combination {
int nueyong[ N ], sum_neo[ N ] ;
inline void lear_neoyong() {
sum_neo[ 0 ] = sum_neo[ 1 ] = 1 ;
nueyong[ 1 ] = 1 ;
nueyong[ 0 ] = 1 ;
// sum[ 0 ] = sum[ 1 ] = 1 ;
for (int i = 2 ; i < N ; ++ i) {
int p = mod ;
int k = p / i ;
nueyong[ i ] = (k * (p - nueyong[ p % i ])) % p ;
sum_neo[ i ] = (nueyong[ i ] * sum_neo[ i - 1 ]) % p ;
// sum[ i ] = ( i * sum[ i - 1 ] ) % p ;
}
}
int Quick_Pow(int alpha, int beta) {
int ans = 1 ;
while (beta > 0) {
if (beta & 1)
ans = (ans * alpha) % mod ;
beta >>= 1 ;
alpha = (alpha * alpha) % mod ;
}
return ans ;
}
} ;
using namespace Combination ;
inline int read() {
int x = 0, f = 1 ;
char c = getchar() ;
while (c < '0' || c > '9') {
if (c == '-') {
f = - f ;
}
c = getchar() ;
}
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0' ;
c = getchar() ;
}
return x * f ;
}
int n, m, all_time, koul ;
signed main() {
n = read() ;
m = read() ;
lear_neoyong() ;
all_time = (((Quick_Pow(2, n) - 1) % mod) + mod) % mod ;
C[ 0 ] = 1 ;
int tot = all_time ;
for (int i = 1 ; i <= m ; ++ i) {
C[ i ] = (C[ i - 1 ] * ((tot + mod) % mod)) % mod ;
tot -- ;
}
dp[ 2 ] = dp[ 1 ] = 0 ;
for (int i = 3 ; i <= m ; ++ i) {
int pri = (C[ i - 1 ] * sum_neo[ i - 1 ]) % mod ;
dp[ i ] = ((((pri - dp[ i - 1 ]) - ((dp[ i - 2 ] * ((all_time - i + 2) % mod + mod) % mod) % mod) + mod) %
mod) * nueyong[ i ]) % mod ;
}
cout << dp[ m ] ;
}
结尾撒花 \(\color{pink}✿✿ヽ(°▽°)ノ✿\)
卡农 -- HNOI2011 -- DP&组合的更多相关文章
- BZOJ.2339.[HNOI2011]卡农(思路 DP 组合 容斥)
题目链接 \(Description\) 有\(n\)个数,用其中的某些数构成集合,求构造出\(m\)个互不相同且非空的集合(\(m\)个集合无序),并满足每个数总共出现的次数为偶数的方案数. \(S ...
- P3214-[HNOI2011]卡农【dp】
正题 题目链接:https://www.luogu.com.cn/problem/P3214 题目大意 一个由\(1\sim n\)的所有整数构成的集合\(S\),求出它的\(m\)个不同非空子集满足 ...
- bzoj2339[HNOI2011]卡农 dp+容斥
2339: [HNOI2011]卡农 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 842 Solved: 510[Submit][Status][ ...
- [HNOI2011]卡农 (数论计数,DP)
题面 原题面 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则. 他将声音分成 n n n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 1 1 ...
- P3214 [HNOI2011]卡农
题目 P3214 [HNOI2011]卡农 在被一题容斥\(dp\)完虐之后,打算做一做集合容斥这类的题了 第一次深感HNOI的毒瘤(题做得太少了!!) 做法 求\([1,n]\)组成的集合中选\(m ...
- 【BZOJ2339】[HNOI2011]卡农 组合数+容斥
[BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确 ...
- [BZOJ2339][HNOI2011]卡农
[BZOJ2339][HNOI2011]卡农 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见& ...
- BZOJ2339[HNOI2011]卡农——递推+组合数
题目链接: [HNOI2011]卡农 题目要求从$S=\{1,2,3……n\}$中选出$m$个子集满足以下三个条件: 1.不能选空集 2.不能选相同的两个子集 3.每种元素出现次数必须为偶数次 我们考 ...
- [HNOI2011]卡农 题解
题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...
- [HNOI2011]卡农
题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...
随机推荐
- get基于报错的sql注入
get基于报错的sql注入发现 Less1: sqli-labs第一关提示说在网页上输入id,也就是?id=1. 但这个?是什么意思,它表示index.php?也就是默认页面.然后?id=1就是把id ...
- PyTorch程序练习(二):循环神经网络的PyTorch实现
一.RNN实现 结构原理 代码实现 import torch import torch.nn as nn class RNN(nn.Module): def __init__(self, input_ ...
- 计算订单签收率的sql查询思路与过程(涉及百分比和四舍五入)
领导提出一个签收率需求,想要通过数据库达到excel中表现的形式,提高计算速度和工作效率, 如下形式: 数据库中表数据结构: 部分数据如下: sql语句思路如下: -- 1.已签收:以物流反馈管道,状 ...
- 移动web布局方法
继续更新移动端的一个布局,这也是经典中的经典,当初只知道个rem和vwvh适配,其实这里面还有很多的门道不只是一个适配这么简单 一.前置 1.背景缩放 我们都知道做移动端,给的图都是二倍图,你拿来用直 ...
- 在IDEA中找不到Mapper报错
前言 相信大多数互联网公司的持久层框架都是使用 Mybatis 框架,而大家在 Service 层引入自己编写的 Mapper 接口时应该会遇到下面的情况: 我们可以看到,上面的红色警告在提示我们,找 ...
- EasyBPM进销存之物料管理
本文是EasyBPM平台实现进销存系列中的一篇,主要讲述物料的相关的管理. 在ERP系统中,"物料"一词有着广泛的含义,它是所有产品.半成品.在制品.原材料.配套件.协作件.易耗品 ...
- mysql:Windows修改MySQL数据库密码(修改或忘记密码)
今天练习远程访问数据库时,为了方便访问,就想着把数据库密码改为统一的,以后我们也会经常遇到MySQL需要修改密码的情况,比如密码太简单.忘记密码等等.在这里我就借鉴其他人的方法总结几种修改MySQL密 ...
- C#枚举高级应用
文章开头先看一道题: 在设计某小型项目的数据库(假设用的是 MySQL)时,如果给用户表(User)添加一个字段(Roles)用来存储用户的角色,你会给这个字段设置什么类型?提示:要考虑到角色在后端开 ...
- 靶机练习: y0usef
靶机: y0usef 准备工作 靶机地址: https://download.vulnhub.com/y0usef/y0usef.ova MD5 校验:28c5d869b003be94b2d8ab4b ...
- Python | 解决方案 | 多个文件共用logger,重复打印问题
项目中封装了logging库为log.py,实现既把日志输出到控制台, 又写入日志文件文件. 环境:python3.7.3 项目中,多个文件共用logger,出现重复打印问题,解决流程记录如下: 文件 ...