2019暑期集训 - Day 17
不开 long long 见祖宗
概述
提高 B 组
3题:T0 , T1 , T2
60/300 分
91/127 名
T0 粉刷 ( paint )
TLE 60/100 分
Description
鸡腿想到了一个很高(sha)明(bi)的问题,墙可以看作一个 \(N\times M\) 的矩阵,有一些格子是有污点的。现在鸡腿可以竖着刷一次,覆盖连续的最多 \(C\) 列,或者横着刷一次,覆盖连续的最多 \(R\) 行。现在鸡腿把墙上的情况告诉你,请你告诉鸡腿最少要刷多少次才能刷干净!
Input
第 \(1\) 行,输入两个正整数 \(N\) , \(M\) 。
第 \(2\) 到 \(N+1\) 行,每行一个长度为 \(M\) 的字符串,每个字符可能是 '.' 表示干净的,或者 'X' 表示这个格子有污点。
第 \(N+2\) 行,输入俩正整数表示 \(R\) 和 \(C\) 。
Output
输出一行一个整数,表示鸡腿最少要刷几次。
Sample Input
输入1:
1 9
XXXXXXXXX
2 3
输入2:
11 14
XXX..XXX..XXX.
.X..X....X...X
.X..X....X...X
.X..X....X...X
.X...XXX..XXX.
..............
...XX...XXX...
....X......X..
....X....XXX..
....X......X..
...XXX..XXX...
1 2
Sample Output
输出1:
1
输出2:
7
Hint
对于50% 的数据 \(1≤N,M≤5\) ;
对于100% 的数据 \(1≤N,M,R,C≤15\) 。
Solution
优雅的暴力
枚举每一行是否粉刷, \(1\) 代表刷这一行, \(0\) 代表不刷这一行。
枚举出的每种情况后,寻找有哪些地方还没有被粉刷,就粉刷这几个地方的列。
最后取最小值
T1 运算符 ( calc )
MLE 0/100 分
Description
鸡腿想到了一个很高(sha)明(bi)的运算符,那就是 '!' ,没错就是感叹号。他给了如下的定义:
- \(n!k = n!(k-1)\times(n-1)!k\ (n> 0\ \&\ k > 0)\)
- $n!k = 1\ (n = 0) $
- $n!k = n\ (k = 0) $
$ $
现在鸡腿告诉你 \(n\) 和 \(k\) 你能告诉他 \(n!k\) 的不同约数个数有多少个吗?只要对 \(1000000009\) 取模就可以了哦!
Input
一行,输入两个正整数 \(n\) , \(k\) 。
Output
一行,输出一个整数表示答案。
Sample Input
输入1:
3 1
输入2:
100 2
Sample Output
输出1:
4
输出2:
321266186
Hint
对于30% 的数据 \(0 <n ≤ 10\ ,\ 0 <k ≤ 10\);
对于100% 的数据 \(0 <n ≤ 1000\ ,\ 0 <k ≤ 100\)。
Solution
DP 呗,还能怎么样
打个质数表,设 \(p_i\) 代表 \(n\) 以内第 \(i\) 个质数。
设 \(f_{i,j,t}\) 代表 \(i!j\) 的结果分解质因数后, \(p_t\) 对应的指数
得到 \(f_{i,j,t}=f_{i-1,j,t}+f_{i,j-1,t}\)
答案为 \((f_{n,k,1}+1)(f_{n,k,2}+1)\cdots (f_{n,k,q}+1)\) ( \(q\) 为 \(n\) 以内第质数个数)
注意初始化 \(f_{i,0}\) 为 \(i\) 分解质因数后的结果。
T2 倾斜的线
TLE 0/100 分
Description
给定两个数 \(P\) 和 \(Q\) 。在二维平面上有 \(n\) 个整点。现在请你找到一对点使得经过它们的直线的斜率在数值上最接近 \(P/Q\) (即这条直线的斜率与 \(P/Q\) 的差最小),请输出经过它们直线的斜率 \(p/q\) 。如果有两组点的斜率的接近程度相同,请输出较小的斜率。保证答案的 \(p/q>0\) ,即输出的 \(p\) 和 \(q\) 都是正整数。
Input
第一行三个正整数 \(n,P,Q\) 。
接下来 \(n\) 行每行两个正整数 \(x,y\) 表示一个点的坐标。保证不存在横坐标相同或者纵坐标相同的点(即斜率不会为无穷大与 \(0\) )
Output
输出仅一行,格式为 \(p/q\) ,表示最接近的斜率,其中 \(p\) 和 \(q\) 都是正整数。
Sample Input
6 15698 17433
112412868 636515040
122123982 526131695
58758943 343718480
447544052 640491230
162809501 315494932
870543506 895723090
Sample Output
193409386/235911335
Hint
对于 \(1\sim 10\) 号测试点(50%): \(2\le n\le 10^3\) 。
对于所有测试点(100%): \(2\le n\le 2\times 10^5\ ,\ 1\le P,Q,x,y\le 10^9\) 。
Solution
奇怪的方法
过每个点以 \(P/Q\) 为斜率作一条直线,记录这些直线的截距。
将这些截距排序。
很容易看出,只有对应截距相邻的两点,才可能更新答案(最接近 \(P/Q\) 的 \(p/q\))。
然后就是枚举没两个“相邻”点所构成的直线的斜率,取最接近的就行了。
注意算斜率用 \(double\) 有精度问题,最好手写分数结构体。
变量数据范围、精度、占用空间整理
char
字符
\(1\) 字节
\(0\sim 255\)
short
整数
\(2\) 字节
\(-32768\sim 32767\)
unsigned short
非负整数
\(2\) 字节
\(0\sim 65535\)
int
整数
\(4\) 字节
\(-2147483648\sim 2147483647\)
unsigned int
非负整数
\(4\) 字节
\(0\sim 4294967295\)
long long
整数
\(8\) 字节
\(-9223372036854775808\sim 9223372036854775807\)
unsigned long long
非负整数
\(8\) 字节
\(0\sim 18446744073709551615\)
float
浮点型
\(4\) 字节
\(-3.4E-38\sim 3.4E+38\)
\(6\sim 7\) 位有效数字
double
浮点型
\(8\) 字节
\(-1.7E-308\sim 1.7E+308\)
\(15\sim 16\) 位有效数字
long double
浮点型
\(8\sim 16\) 字节
至少
\(-1.7E-308\sim 1.7E+308\)
\(15\sim 16\) 位有效数字
至多
\(-1.2E-4932\sim 1.2E+4932\)
\(18\sim 19\) 位有效数字
在定义变量时,加上 register 会使访问速度快一些。

浙公网安备 33010602011771号