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)的运算符,那就是 '!' ,没错就是感叹号。他给了如下的定义:

  1. \(n!k = n!(k-1)\times(n-1)!k\ (n> 0\ \&\ k > 0)\)
  2. $n!k = 1\ (n = 0) $
  3. $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 会使访问速度快一些。

posted @ 2019-12-27 17:09  imzzy  阅读(40)  评论(0)    收藏  举报