卡农 -- 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 个音阶构成的 ...
随机推荐
- Ubuntu 18.04 安装OneDrive自动同步
Ubuntu 18.04 安装OneDrive自动同步 Windows10系统已经自带了OneDrive的自动同步功能,对于多设备用户而言已经成为了一个非常方便传输保存文件的途径,在Ubuntu下也有 ...
- 3568F-Linux-RT系统测试手册
- 200 行 ,一个PYQT 窗口 + 后台 AIOHTTP 服务 , 例子
直接上代码 import sys from typing import Dict, List from aiohttp import web import asyncio from functools ...
- MySQL执行过程及执行顺序
一.MySQL执行过程 简单概括: 1.我们在客户端发起一个SQL的查询: 2.连接器判断用户登录以及用户权限: 3.缓存命中,走缓存,直接返回查询结果: 3.缓存没命中,到达分析器,对SQL语句进行 ...
- HTB- Archetype
端口扫描 nmap -sV -sT 10.129.1.1 smbclint smbclient -L 10.129.149.214 获取密码 smbclient //10.129.149.214/ba ...
- TP5 连接多个数据库
use think\Config; $config = Config::get('database2'); //读取第二个数据库配置 $connect = Db::connect($config); ...
- iOS开发基础109-网络安全
在iOS开发中,保障应用的网络安全是一个非常重要的环节.以下是一些常见的网络安全措施及对应的示例代码: Swift版 1. 使用HTTPS 确保所有的网络请求使用HTTPS协议,以加密数据传输,防止中 ...
- 超级炫酷的终端神器 eDEX-UI
目录 eDEX-UI主要亮点: 优点: 软件简介 安装 Linux Windows 效果 更换皮肤 matrix Tron-disrupted 退出 常见问题解答 eDEX-UI,不仅是一款全屏幕.跨 ...
- 学习笔记--Java构造方法
Java构造方法 关于构造方法 构造方法又被称作:构造函数/构造器/Constructor 语法结构: [修饰符列表] 构造方法名(形式参数列表){ 构造方法体; } 对比普通方法语法结构 [修饰符列 ...
- java面试一日一题:rabbitMQ如何保证消息不丢失
问题:请讲下rabbitMQ如何保证消息不丢失 分析:该问题属于概念题,同时也是一个设计方面的题,牵扯到部分设计层面的东西: 回答要点: 主要从以下几点去考虑, 1.rabbitMQ在保证消息不丢失方 ...