Dwango Programming Contest 6th E 题解
题目大意
你有一条区间\([0, X)\),并且有一个数组\(L_1, ..., L_n\)。对于任意\(1 \leq i \leq n\),你可以指定一个非负整数\(0 \leq j_i \leq X - L_i\)。求有多少种指定的方法,使得\([j_1, j_1 + L_1), [j_2, j_2 + L_2), ..., [j_n, j_n + L_n)\)能覆盖\([0, X)\)这段区间,输出这个方案数模\(1000000007\)的最小非负剩余。
约束条件
\(1 \leq N \leq 100\)
\(1 \leq L_i \leq X \leq 500\)
歧路
这是一个覆盖问题,考虑使用\(DP\)来解决。设\(f_i\)表示覆盖了\([0, i)\)的方案数。
发现无论怎么增加状态,这个\(DP\)无法正确的转移。
为什么?
不同长度的线段的先后覆盖无法由较少的状态来表示。
需要对这个问题进行转换。
第一个想法
使用容斥原理。
如果我们固定\(S \in [0, X) \bigcap Z\),考虑求对于任意\(i \in S\),\([i, i + 1)\)这段小区间不被任何\(n\)个区间覆盖的方案数。
那么考虑这\(\lvert S \rvert\) 段小区间把\([0, X)\)分为了\(k\)段,其中长度为\(i(1 \leq i \leq X)\)的段的个数是\(a_i\)。那么考虑这\(N\)段弧中的第\(i\)段弧可以放在哪里?
000111000011110001111110001
--- ---- --- ---
---111----1111---111111---1
对\([j_i, j_i + L_i)\),它必定在\(k\)段中的某一段,并且这一段的长度不小于\(L_i\)。若这一段长度是\(k\),那么放法个数为\(k - L_i + 1\)。
因此,方案数为:
\]
根据容斥原理,我们枚举\(S\),计算方案数,再将它们乘以\((-1)^{\lvert S \rvert}\) 相加,就得到最终的答案。
复杂度为\(O(poly(N,X) \cdot 2^X)\)。
如何优化?
第二个想法
我们设有\(c_i(1 \leq i \leq X)\)个\(L\)数组的值为\(i\)。固定了\(a_1, ..., a_L\)后,对答案的贡献是:
\]
(<1> 固定了\(a_1, ..., a_L\),\(N\)个区间有多少种放法 <2> 考虑如果将这些空的段按照某个顺序排起来 <3> 如何从这些空的段的相对位置还原出\(S\))
是不是很容易想到倒着\(DP\)计算这个式子呢?
我们按\(i\)从大到小\(DP\),在\(DP\)的时候,我们固定的是\(a_i, a_{i + 1}, ..., a_X\)的取值,\(DP\)的状态需要记录:
(1) $ j = \sum_{m = i}^{X} a_m$
(2) \(k = \sum_{m = i}^{X} ma_m\)
设\(f_{i, j, k}\)表示固定了\(a_i, a_{i + 1}, ..., a_{X}\)的取值,以及当\(j = \sum_{m = i}^{X} a_m\),\(k = \sum_{m = i}^{X} ma_m\)时\((2)\)式\(\ge i\)的部分的乘积之和。
(就是\(\prod_{m = i}^{X} \frac{1}{a_m!} (\sum_{j \ge m} a_j (j + 1 - m))^{c_m}\)的和)
容易写出转移式:
\]
最终答案为:
\]
直接计算似乎会超时,如何通过此题?
复杂度分析
状态中\((i, j, k)\)满足\(k \ge i \cdot j \rightarrow j \leq [\frac{X}{i}]\)。
要计算复杂度,就是要计算四元有序非负整数数组\((i, j, k, l)\)中满足\(1 \leq i \leq X, 0 \leq j, k, l \leq X, k \ge i \cdot j,l \leq j\)的量级。
先固定\(i\),则\(0 \leq l \leq j \leq [\frac{X}{i}]\),\((l, j)\)的取值有\(O(\frac{X^2}{i^2})\) 种。
而总共有\(\sum_{i = 1}^{X} \frac{X^2}{i^2} < \frac{\pi ^2}{6} X^2\) (\(\sum_{i = 1}^{\infin} {\frac{1}{i^2} < 1 + \sum_{i = 2}^{\infin} \frac{1}{i(i - 1)}} = 1 + \sum_{i = 2}^{+\infin} \frac{1}{i - 1} - \frac{1}{i} = 2\)。)
且\(k\)的取值一共有\(O(X)\)种,故实际上这样的四元有序数组个数是\(O(X^3)\)的。
时间复杂度\(O(X^3)\),可以通过此题。
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << (x) << endl
using namespace std;
const int N = 105, X = 505;
const long long mod = 1000000007ll;
int n, x, cnt[X];
long long c[X][X], f[X][X], g[X][X];
long long qpow (long long a, long long b) {
long long res = 1ll;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod, b >>= 1;
}
return res;
}
int main () {
cin >> n >> x;
for (int i = 1; i <= x; i++) cnt[i] = 0;
for (int i = 1; i <= n; i++) {
int l;
cin >> l;
cnt[l]++;
}
for (int i = 0; i <= x; i++) c[i][0] = c[i][i] = 1ll;
for (int i = 1; i <= x; i++) {
for (int j = 1; j < x; j++) c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
}
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= x; j++) f[i][j] = 0ll;
}
f[0][0] = 1ll;
for (int i = x; i >= 1; i--) {
for (int j = 0; j <= x; j++) {
for (int k = i * j; k <= x; k++) {
long long coef = qpow(k - (i - 1) * j, cnt[i]);
g[j][k] = 0ll;
for (int l = 0; l <= min(j, k / i); l++) g[j][k] = (g[j][k] + f[j - l][k - l * i] * c[j][l] % mod * coef) % mod;
}
}
for (int j = 0; j <= x; j++) {
for (int k = 0; k <= x; k++) f[j][k] = g[j][k];
}
}
long long ans = 0ll;
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= min(x, i + 1); j++) {
if (i & 1) ans = (ans + mod - f[j][x - i] * c[i + 1][j]) % mod;
else ans = (ans + f[j][x - i] * c[i + 1][j]) % mod;
}
}
printf("%lld\n", ans);
return 0;
}
Dwango Programming Contest 6th E 题解的更多相关文章
- Programming Contest Ranking(题解)
Programming Contest Ranking . 题目描述 Heilongjiang Programming Contest will end successfully! And your ...
- 【AtCoder】Dwango Programming Contest V题解
A - Thumbnail 题意简述:给出N个数,找出N个数中和这N个数平均值绝对值最小的数 根据题意写代码即可= = #include <bits/stdc++.h> #define f ...
- AtCoder [Dwango Programming Contest V] E 动态规划 多项式
原文链接 https://www.cnblogs.com/zhouzhendong/p/AtCoder-Dwango-Programming-Contest-V-E.html 题意 有 $n$ 个数, ...
- AtCoder Dwango Programming Contest V E
题目链接:https://dwacon5th-prelims.contest.atcoder.jp/tasks/dwacon5th_prelims_e 题目描述: 给定一个大小为\(N\)的数组\(A ...
- 2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16) 题解
题目链接:http://codeforces.com/gym/101147 2017/8/27日训练赛,题目情况9/11,Rank 4/79. A. The game of Osho 题意:定义一个子 ...
- Atcoder Dwango Programming Contest V
模拟,做了ABC三题. D难一些,就不会了. 中规中矩的吧... Atcoder DPCV B 题意:给一个序列,求出所有的子串和中AND值最大的k个数的AND. 思路:既然要求AND,那么肯定按位考 ...
- The 15th Zhejiang Provincial Collegiate Programming Contest(部分题解)
ZOJ 4024 Peak 题意 给出n和n个数,判断该数列是否是凸形的. 解题思路 从前往后第一对逆序数,和从后往前第一队逆序数,如果都非零而且相邻,证明该数组是凸形的. 代码 #include & ...
- 2017 JUST Programming Contest 2.0 题解
[题目链接] A - On The Way to Lucky Plaza 首先,$n>m$或$k>m$或$k>n$就无解. 设$p = \frac{A}{B}$,$ans = C_{ ...
- Atcoder Yahoo Programming Contest 2019 简要题解
A-C 直接放代码吧. A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"NO&q ...
随机推荐
- linux 内核 同步原理
中断分为同步中断和异步中断. 同步中断是由CPU控制单元产生的,"同步"是指只有在一条指令执行完毕后,CPU才会发出中断,比如系统调用 异步中断是由其他硬件设备依照CPU时钟信号产 ...
- mysql之冷备和mysqldump、mydumper、xtrabackup备份
1.冷备流程: 停库备份,冷备份一般用于非核心业务,这类业务一般都允许停库. 在停止数据库后,将数据文件拷贝出来,然后对原始数据文件进行备份. 流程: 1.关闭数据库备份 2.拷贝数 ...
- linux云服务搭建七日杀服务器
目录 准备工作 1.设置swap 2.安装screen 3.安装SteamCmd运行所需环境 4.创建一个用户 steamCMD与七日杀服务器端 1.下载并安装SteamCMD 2.登录steam账号 ...
- 12.java设计模式之代理模式
基本介绍: 代理模式(Proxy)为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能,想在 ...
- Android ContentProvider 启动分析
对于 ContentProvider 还不是很熟悉的同学,可以阅读上一篇 Android ContentProvider 基本原理和使用详解.本文主要是对 contentProvider 的源码进行分 ...
- CURLOPT_FOLLOWLOCATION
curl爬取过程中,设置CURLOPT_FOLLOWLOCATION为true,则会跟踪爬取重定向页面,否则,不会跟踪重定向页面
- mysql的索引、视图、存储过程(自我理解总结)
一.索引 索引在MySQL中也叫'键'或者'key',是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要,减少IO次数,加 ...
- 给力啊!这篇Spring Bean的依赖注入方式笔记总结真的到位,没见过写的这么细的
1. Bean的依赖注入概念 依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现.在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是 ...
- 【ACwing 100】InDec序列——差分
(题面来自AcWing) 给定一个长度为 n 的数列 a1,a2,-,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一. 求至少需要多少次操作才能使数列中的所有数都一样, ...
- vue微博回调接口
1.vue微博回调空页面 注:微博回调空页面为: http://127.0.0.1:8888/oauth/callback/ 1.1 页面路径 components\oauth.vue <tem ...