2019暑期集训 - Day 9

成绩终于回升了





概述

提高 B 组
4题:T0 , T1 , T2 , T3
192.5/400 分
28/157 名


T0 粉刷匠

RE 80/100 分

Description

windy 有 \(N\) 条木板需要被粉刷。
每条木板被分为 \(M\) 个格子。
每个格子要被刷成红色或蓝色。
windy 每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。
每个格子最多只能被粉刷一次。
如果 windy 只能粉刷 \(T\) 次,他最多能正确粉刷多少格子?
一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。

Input

第一行包含三个整数, \(N\ ,\ M\ ,\ T\)
接下来有 \(N\) 行,每行一个长度为M的字符串, '0' 表示红色, '1' 表示蓝色。

Output

输出一个整数,表示最多能正确粉刷的格子数。

Sample Input

3 6 3
111111
000000
001100

Sample Output

16

Hint

100% 的数据,满足 \(1 \leq N,M \leq 50\) ; 0 <= T <= 2500 。

Solution

美丽的 DP

\(f_{i,j,k}\) 代表在刷完第 \(i\) 块木板第 \(j\) 个格子及这以前,粉刷 \(k\) 次所能得到的最大正确数。
比如样例中, \(f_{3,2,0}=0,f_{3,2,1}=6,f_{3,2,2}=12,f_{3,2,3}=14\)

可以得出转移方程 \(f_{i,j,k}=max(f_{i,j-t,k}\ ,\ f_{i,j-t,k-1}+s[j-t+1][j])\) 其中 \(s[j-t+1][j]\) 代表在这个木板中,从第 \(i-t+1\) 个格子以第 \(j\) 个格子的颜色粉刷到第 \(j\) 个格子能得到的正确数。( \(s\) 可以直接暴力枚举,无需优化了)

然后上 DP ,就 AC 了

T1 迷路

WA 12.5/100 分

Description

windy在有向图中迷路了。
该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1。
现在给出该有向图,你能告诉windy总共有多少种不同的路径吗?
注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。

Input

第一行包含两个整数, \(N,T\)
接下来有 \(N\) 行,每行一个长度为 \(N\) 的字符串。
\(i\) 行第 \(j\) 列为 '0' 表示从节点 \(i\) 到节点 \(j\) 没有边。
为 '1' 到 '9' 表示从节点 \(i\) 到节点 \(j\) 需要耗费的时间。

Output

输出一个整数,可能的路径数,这个数可能很大,只需输出这个数除以 2009 的余数。

Sample Input

2 2
11
00

Sample Output

1

Hint

100% 的数据,满足 \(2 \leq N \leq 10\ ,\ 1 \leq T \leq 1000000000\)

Solution

这题啊,奇葩

简单说,利用矩阵乘法的定义,可以用幂运算快速得到第 \(k\) 个时刻到达每个点的方案数。

具体所,,,
具体说我也说不清楚,稍微改了一下题解,搬过来。

由于这道题的 \(T\) 很大,线性算法是过不了的,所以我们考虑矩阵乘法。
这道题图中的边权为 \(1\sim 9\),比较小,所以考虑拆点,为了方便表示,把编号为 \(i\) 的点拆为 \(10i+1\sim 10i+9\) 一共 \(9\) 个节点。如果 \(i\)\(j\) 有一条权值为 \(k\) 的路径,那么就把矩阵中 \([\ 10i+k\ ,\ 10j+1\ ]\) 的值设为 \(1\),相当于先从 \(10i+1\to 10i+k\) 走过 \(k-1\) 条长度为 \(1\) 的路径,再在 \(10i+k\to 10j+1\) 走过 \(1\) 条长度为 \(1\) 的路径,总长度为 \(k\)
如此,矩阵每次乘法运算后,每个位置都相当于更新到了下一个时刻从 \(i\)\(j\) 的方案数,因为矩阵乘法的运算方式刚好和计算下一个时刻的方案数(连乘的方式都是一模一样的)
跑一遍快速幂,计算矩阵的 \(T\) 次幂, 此时矩阵中的 \([0][10n+1]\) 的值即是方案总数。

T2 游戏

Description

windy 学会了一种游戏。 对于 \(1\)\(N\)\(N\) 个数字,都有唯一且不同的 \(1\)\(N\) 的数字与之对应。 最开始 windy 把数字按顺序 \(1,2,3,\cdots ,N\) 写一排在纸上。 然后再在这一排下面写上它们对应的数字。 然后又在新的一排下面写上它们对应的数字。 如此反复,直到序列再次变为 \(1,2,3,\cdots ,N\)
如: \(1\ 2\ 3\ 4\ 5\ 6\) 对应的关系为
\(1\to 2\ 2\to 3\ 3\to 1\ 4\to 5\ 5\to 4\ 6\to 6\)
windy的操作如下

1 2 3 4 5 6
2 3 1 5 4 6
3 1 2 4 5 6
1 2 3 5 4 6
2 3 1 4 5 6
3 1 2 5 4 6
1 2 3 4 5 6

这时,我们就有若干排 \(1\)\(N\) 的排列,上例中有 \(7\) 排。 现在 windy 想知道,对于所有可能的对应关系,有多少种可能的排数。

Input

一个整数, \(N\)

Output

一个整数,可能的排数。

Sample Input

3

Sample Output

3

Hint

100% 的数据,满足 \(1 \leq N \leq 1000\)

Solution

好骄傲啊,考试手 A 紫题

很容易发现,每个数的变化都有周期,而只有在每个周期都满了时,序列才会还原,也就是排数等于所有周期的最小公倍数加一。

第一个想法是暴力枚举每种周期分布,比如以 \(6\) 为例
\(6=1+1+1+1+1+1\)
\(6=1+1+1+1+2\)
\(6=1+1+2+2\)
\(6=2+2+2\)
\(6=1+1+1+3\)
\(6=1+2+3\)
\(6=3+3\)
\(6=1+1+4\)
\(6=2+4\)
\(6=1+5\)
\(6=6\)
然后求有多少种不同的排数。
但是这样太慢,而且就空间说几个大硬盘都装不下 . . .

必须用方案2了

正解
既然没办法枚举周期分布,那我们就枚举每个周期呗
注意到对于周期 \(a\) 和周期 \(b\ \ \ (\ a\ ,\ b\ )=0\) ,将其分为两个周期 \([a],[b]\) 所需的数 \(a+b\) 个总是比合并为一个周期 \([ab]\) 所需的数 \(ab\) 个少。所以我们要以最优情况入手,及每个周期都为质数的幂( \(p^q\) )。
先打表出 1000 以内的质数,递归枚举每一种成立的方案:各个质数 \(p\) 对应的指数 \(q\) 。那么每个周期就为对应的 \(p^q\)
因为两个质数间是互质的,所以每种周期方案也能对应不同的最小公倍数,即排数不同。
因此,得到的方案数就是答案了。

T3 windy数

WA 0/100 分

Description

windy 定义了一种 windy 数。
不含前导零且相邻两个数字之差至少为 \(2\) 的正整数被称为 windy 数。
windy 想知道,在 \(A\)\(B\) 之间,包括 \(A\)\(B\) ,总共有多少个 windy 数?

Input

两个整数, \(A\ B\)

Output

一个整数,表示 \(A\sim B\) 中有多少个 windy 数。

Sample Input

1 10

Sample Output

9

Hint

100% 的数据,满足 \(1 \leq A \leq B \leq 2000000000\)

Solution

数位 DP 模板题,今天最简单的题我能得最低分 . . .

预处理 \(f_{i,j}\) 代表 \(i\) 位数以 \(j\) 为最高位的 windy 数个数。
分别求出 \(B+1\) 以下和 \(A\) 以下的 windy 数个数(根据预处理的结果,很好计算),然后相减,即为答案。





矩阵

这两天都有矩阵的题目,我总结一下


定义

\(m × n\) 个数 \(a_{i,j}\) 排成的 \(m\)\(n\) 列的数表称为 \(m\)\(n\) 列的矩阵,简称 \(m × n\) 矩阵。记作:

\(m×n\) 个数称为矩阵 \(A\) 的元素,简称为元,数 \(a_{i,j}\) 位于矩阵 \(A\) 的第 \(i\) 行第 \(j\) 列,称为矩阵 \(A\)\((i,j)\) 元,以数 \(a_{i,j}\)\((i,j)\) 元的矩阵可记为 \((a_{i,j})\)\((a_{i,j})_{m × n}\)\(m×n\) 矩阵 \(A\) 也记作 \(A_{(m,n)}\)
元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵。而行数与列数都等于 \(n\) 的矩阵称为 \(n\) 阶矩阵或 \(n\) 阶方阵。

运算

矩阵运算在科学计算中非常重要,而矩阵的基本运算包括矩阵的加法,减法,数乘,转置,共轭和共轭转置,矩阵还有很重要的乘法运算,在应用中经常出现。

加法

矩阵的加法满足下列运算律( \(A\)\(B\)\(C\) 都是同型矩阵):

应该注意的是只有同型矩阵之间才可以进行加法。

减法

乘法


跟数的幂计算方式一样,也可以用快速幂,在解题中经常用到

posted @ 2019-12-27 16:54  imzzy  阅读(47)  评论(0)    收藏  举报