[JZOJ6344] 【NOIP2019模拟2019.9.7】Huge Counting
题目
题目大意自己看题去……
正解
比赛时在刚第二题,所以根本没有时间思考……
模型可以转化为从\((x_1,x_2,..,x_n)\)出发到\((1,1)\)的方案数模\(2\)。
方案数就用有重复的排列公式:\(\frac{(\sum{x_i})!}{\prod x_i!}\)
考虑它的奇偶性。显然可以将上面的\(2\)因子个数求出来,减去下面的个数,如果为\(0\)则是奇数。
这个东西也就是下面这条式子:\(\sum_{w=2^i} (\lfloor \frac{\sum_{x_i}}{w} \rfloor-\sum{\lfloor \frac{x_i}{w}\rfloor})\)
显然这条式子是大于等于\(0\)的。我们考虑它是否等于\(0\)。
然后我们就发现,如果有相加的时候有进位,那么它就会对下一位有贡献,而这一位的贡献不变。这意味着上式的值至少加\(1\)。
所以,若要它等于\(0\),一定要保证相加的时候没有进位,也就是每一位上为\(1\)的数至多有\(1\)个。
于是就开始DP:设\(f_{i,S}\)表示从高到低到\(i\)位,\(S\)为贴着上限的状态。
由于有上下界的限制,所以容斥一下就可以了。
代码
using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mo 990804011
#define ll long long
#define N 9
int n;
ll l[N],r[N],lim[N];
ll ans;
ll f[51][512];
inline void upd(ll &a,ll b){a=(a+b)%mo;}
inline ll calc(){
	memset(f,0,sizeof f);
	f[50][(1<<n)-1]=1;
	for (int i=50;i>=1;--i)
		for (int j=0;j<1<<n;++j){
			if (!f[i][j])
				continue;
			int s=0;
			for (int l=0;l<n;++l)
				if (j>>l&1 && !(lim[l]>>i-1&1))
					s|=1<<l;
			upd(f[i-1][s],f[i][j]);
			for (int k=0;k<n;++k)
				if (j>>k&1 && lim[k]>>i-1&1 || !(j>>k&1)){
					int s_=s&((-1)^1<<k) | ((j>>k&1 && lim[k]>>i-1&1)?1<<k:0);
					upd(f[i-1][s_],f[i][j]);
				}
		}
	ll res=0;
	for (int i=0;i<1<<n;++i)
		res+=f[0][i];
	return res%mo;
}
void dfs(int k,int flag){
	if (k==n){
		ans+=calc()*flag;
		return;
	}
	lim[k]=r[k];
	dfs(k+1,flag);
	if (l[k]-1>=0){
		lim[k]=l[k]-1;
		dfs(k+1,-flag);
	}
}
int main(){
	freopen("c.in","r",stdin);
	freopen("c.out","w",stdout);
	int T;
	scanf("%d",&T);
	while (T--){
		scanf("%d",&n);
		for (int i=0;i<n;++i)
			scanf("%lld%lld",&l[i],&r[i]),l[i]--,r[i]--;
		ans=0;
		dfs(0,1);
		ans%=mo;
		ans=(ans<0?ans+mo:ans);
		printf("%lld\n",ans);
	}
	return 0;
}
总结
坦白说我的脑子真是太不好了……
[JZOJ6344] 【NOIP2019模拟2019.9.7】Huge Counting的更多相关文章
- jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)
		
Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...
 - 6424. 【NOIP2019模拟2019.11.13】我的订书机之恋
		
题目描述 Description Input Output Sample Input 见下载 Sample Output 见下载 Data Constraint 题解 lj题卡线段树 求出每个右端点往 ...
 - 6392. 【NOIP2019模拟2019.10.26】僵尸
		
题目描述 题解 吼题但题解怎么这么迷 考虑一种和题解不同的做法(理解) 先把僵尸离散化,h相同的钦(ying)点一个大小 (可以发现这样每种情况只会被算正好一次) 计算完全被占领的方案,然后1-方案/ ...
 - 6389. 【NOIP2019模拟2019.10.26】小w学图论
		
题目描述 题解 之前做过一次 假设图建好了,设g[i]表示i->j(i<j)的个数 那么ans=∏(n-g[i]),因为连出去的必定会构成一个完全图,颜色互不相同 从n~1染色,点i的方案 ...
 - 6377. 【NOIP2019模拟2019.10.05】幽曲[埋骨于弘川]
		
题目描述 题解 随便bb 详细题解见 https://www.cnblogs.com/coldchair/p/11624979.html https://blog.csdn.net/alan_cty/ ...
 - 6364. 【NOIP2019模拟2019.9.20】养马
		
题目描述 题解 一种显然的水法:max(0,-(点权-边权之和*2)) 这样会挂是因为在中途体力值可能会更小,所以考虑求走完每棵子树所需的至少体力值 考虑从子树往上推求出当前点的答案 设每棵子树从根往 ...
 - 6362. 【NOIP2019模拟2019.9.18】数星星
		
题目描述 题解 一种好想/好写/跑得比**记者还快的做法: 对所有询问排序,按照R递增的顺序来处理 维护每个点最后一次被覆盖的时间,显然当前右端点为R时的答案为所有时间≥L的点的权值之和 LCT随便覆 ...
 - 6359. 【NOIP2019模拟2019.9.15】小ω的树(tree)(定期重构)
		
题目描述 题解 qy的毒瘤题 CSP搞这种码农题当场手撕出题人 先按照边权从大到小建重构树,然后40%暴力修改+查找即可 100%可以定期重构+平衡规划,每次把B个询问拉出来建虚树,在虚树上暴力维护每 ...
 - 【NOIP2019模拟2019.11.13】旅行 && GDKOI2018 还念(二分答案+dij)
		
Description: 题解: 显然满足二分性. 并且每一条边要不选l要不选r. 二分的那条链肯定要选l. 考虑有两个人在走最短路,一个人一开始必须走二分的那条链,要求第一个人走的比第二个人快. 安 ...
 
随机推荐
- ArrayList底层代码解析笔记
			
通过底层代码可以学习到很多东西: public class ArrayList<E> extends AbstractList<E> implements List<E& ...
 - WAMP中的mysql设置密码(默认密码为空)及phpmyadmin的配置
			
来自: http://wenku.baidu.com/link?url=J4K28e1kt-_ykJLsOtS1b5T6hKj5IzL5hXSKIiB133AvPCUXLlxGKScsBsxi0mA ...
 - cross compile 交叉编译 ffmpeg
			
ffmpeg 支持各种压缩格式的视频解码库,经常出现在各种播放器中,交叉编译也是一项麻烦的事情. 1. 下载ffmpeg 源码包 http://ffmpeg.org/releases/ffmpeg ...
 - 笔记53 Mybatis快速入门(四)
			
动态SQL 1.if 假设需要对Product执行两条sql语句,一个是查询所有,一个是根据名称模糊查询.那么按照现在的方式,必须提供两条sql语句:listProduct和listProductBy ...
 - vue生态系统之vue-router
			
一.vue-router安装与使用 1.安装 进入项目目录中安装vue-router模块 E:\vueProject\webpackProject>cnpm install vue-router ...
 - 安装 Confluence6.7.1 笔记
			
安装 Confluence6.7.1 我是使用命令行进入mysql的mysql -uroot -p123456 创建数据库 CREATE DATABASE confluence DEFAULT CHA ...
 - vue+elementui 中 @keyup  键盘上下左右移动聚焦
			
<template> <el-table :data="CreditUnclearOutlineList" border style="width: 1 ...
 - Android中的Parcel机制(下)
			
上一篇中我们透过源码看到了Parcel背后的机制,本质上把它当成一个Serialize就可以了,只是它是在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此会更加高效. 我们接下来要说的是Pa ...
 - 38 ubuntu/windows双系统安装
			
0 引言 (1)针对bios 和 uefi引导,安装方式略有不同. (2)针对nvidia显卡,在安装时需要特殊设置. 1 EasyBCD安装方式介绍-适用于bios引导方式 参考百度经验贴安装即可, ...
 - Delphi 与SQL编程
			
Delphi 与SQL编程 SQL语言作为关系数据库管理系统中的一种通用的结构查询语言, 已经被众多的数据库管理系统所采用,如Oracle.Sybase.Informix等数据库管理系统,它们都支持S ...