2019暑期集训 - Day 20

\(0\) 分和 \(100\) 分的差距就是那么一丢丢 . . .





概述

提高 B 组
3题:T0 , T1 , T2
90/300 分
40/119 名


T0 旅游(travel)

RE 60/100 分

Description

ztxz16 如愿成为码农之后,整天的生活除了写程序还是写程序,十分苦逼。终于有一天,他意识到自己的生活太过平淡,于是决定外出旅游丰富阅历。
ztxz16 生活的城市有 \(N\times M\) 个景点,可以描述成一个 \(N\times M\) 的矩形,每个景点有一个坐标 \((x,y)\ (1 \le x \le N\ ,\ 1 \le y \le M)\) 以及美观度 \(A[x][y]\) 和观赏所需的时间 \(B[x][y]\) ,从一个景点 \((x_1, y_1)\) 走到另一个景点 \((x_2, y_2)\) 需要时间为它们之间的曼哈顿距离:\(|x_1 - x_2| +|y_1 - y_2|\)
为了防止审美疲劳, ztxz16 希望观赏的景点的的美观度是严格上升的,由于不想太早回家码代码, ztxz16 希望旅游的总时间尽可能长。

Input

第一行输入两个整数 \(N, M\)
接下来 \(N\) 行每行 \(M\) 个整数,第 \(x\) 行第 \(y\) 个整数代表 \(A[x][y]\)
接下来 \(N\) 行每行 \(M\) 个整数,第 \(x\) 行第 \(y\) 个整数代表 \(B[x][y]\)
注意,有一些 \(A[x][y]=B[x][y]=0\) ,说明这个景点已经拆除,不能游览;

Output

输出一行代表最长的总时间。

Sample Input

4 5
1 2 6 0 2
1 3 4 0 4
0 0 4 0 3
2 2 0 0 4
1 3 5 0 2
2 8 1 0 2
0 0 3 0 4
0 5 0 0 3

Sample Output

39

Hint

【样例说明】

游览顺序为 \((2,1)\to(1,5)\to(2,2)\to(4,5)\to(1,3)\)

【数据范围】

对于30% 的数据:\(1\le N\le 50 , 1\le M\le 50\)
对于60% 的数据:\(1\le N\le 300 , 1\le M\le 300\)
对于100% 的数据:\(1\le N\le 1000 , 1\le M\le 1000 , 0\le A[x][y]\le 1000000 , 0\le B[x][y]\le 10^9\)

注意:本题输入数据较大,请注意输入消耗的时间

Solution

我想这可能不是正解吧

考虑 DP 思想。
如果当前位置为 \((i,j)\) ,那么对于最优方案,下一步如果到 \((x,y)\) ,那么一定不存在一对 \((p,q)\) ,使得 \(A[i][j]<A[p][q]<A[x][y]\) 因为如果存在的话,那么下一步走到 \((p,q)\) 一定会更优。
我们先按 \(A\) 值从大到小排序,然后顺着计算 \(f[i][j]\) (以 \((i,j)\) 为起点的答案)。\(f[i][j]\) 可以从所有满足上述条件的下一步 \((x,y)\)\(A[x][y]\) 更新。
具体来说, \(f[i][j]=B[i][j]+\max{(f[x][y]+|x-i|+|y-j|)}\)
最后答案为所有 \(f\) 的最大值。

T1 做梦(dream)

WA 0/100 分

Description

ztxz16 旅游归来后十分疲倦,很快就进入了梦中。
在梦中 ztxz16 结婚生子了,他不得不照顾小宝宝。但这实在太无聊了,于是 ztxz16 会在散步。梦中 ztxz16 住在一个类似数轴的街上,数轴上的每个整点是一个街区,每个单位时间内 ztxz16 可以选择向左走一个街区或者向右走一个街区,但如果他离开家超过 \(m\) 个单位时间小宝宝会有危险,因此 ztxz16 必须在距离上次在家中不超过 \(m\) 个单位时间内回到家中。
\(n\) 个单位时间后 ztxz16 会醒来,他希望此时正好在家中。
ztxz16 想知道散步过程可能有多少种不同的散步过程。两个散步过程被认为不同,当且仅当存在至少一个单位时刻 ztxz16 选择的走向不同。

Input

第一行输入两个整数 \(n\) , \(m\)

Output

输出可能的散步过程数 \(\%\ 1000000007\)

Sample Input

输入1:
4 2

输入2:
10 6

Sample Output

输出1:
4

输出2:
184

Hint

对于30% 的数据: \(2\le n\le 100\ ,\ 2\le m\le 100\)
对于100% 的数据: \(2\le n\le 10^9\ ,\ 2\le m\le 100\)
\(n\)\(m\) 均为偶数

Solution、

DP \(+\) 矩阵快速幂 \(=\) 我去什么鬼毒瘤

先考虑一个问题:
计算对于 \(2\sim m\) 中每个偶数 \(x\) ,从家出发刚好在 \(x\) 步时首次回家的走法数。
设家位于原点编号为 \(0\) ,每向右一格编号 \(+1\)
\(f[i][j]\) 代表在第 \(i\) 步时走到编号为 \(j\) 的点有多少种走法。
我们先只算第一步往右走的情况。
因为个时间单位只能往左走一步或往右走一步,所以很容易得到
\(f[1][1]=1\)
\(f[i][j]=f[i-1][j-1]+f[i-1][j+1]\)
于是我们上 DP ,求出第 \(1\sim m\) 步时走到编号为 \(0\sim \dfrac{n}{2}\) 的点有多少种走法。
那么 \(f[x][0]\times 2\) 即为从家出发刚好在 \(x\) 步时首次回家的走法数。

现在,我们回到原题。
问题是求有多少种情况使第 \(n\) 步到家,并且途中每 \(m\) 步以内必有一步回过家。
\(dp[i]\) 代表如果他睡 \(i\) 分钟后醒来,他能走的方案数。得到
\(\large{dp[i]=\sum\limits_{j=2}^{\min{(i,m)}}dp[i-j]\times 2f[j][0]}\ \small{(j\text{只取偶数})}\)
即枚举上一次离家的时间( \(j\) 个时间单位以前),求和(\(\sum\))。
答案即为 \(dp[n]\)

但是
这个方法有欠缺。
因为 \(n\) 可能会很大,后半部分有可能 TLE 。
所以我们考虑优化。
再观察求和的式子 \(dp[i-j]\times 2f[j][0]\)
很容易发现,这个式子与矩阵乘法很相似。
所以尝试构造一个矩阵。
套矩乘的模板,尝试构造一个如下的初始矩阵:

\(\begin{bmatrix}\ 0&0&...&0&0&2f[m][0]\ \\ \ 1&0&...&0&0&2f[m-2][0]\ \\ \ ...&...&...&...&...&...\ \\ \ 0&0&...&0&0&2f[6][0]\ \\ \ 0&0&...&1&0&2f[4][0]\ \\ \ 0&0&...&0&1&2f[2][0]\ \end{bmatrix}\)

比如 \(m=8\) 时,矩阵为 :

\(\begin{bmatrix}\ 0&0&0&10\ \\ \ 1&0&0&4\ \\ \ 0&1&0&2\ \\ \ 0&0&1&2\ \end{bmatrix}\)

这个矩阵 \(x/2\) 次幂后,右下角的值即为 \(dp[x]\)
因为初始状态右下角即为 \(dp[2]\) ,如果当前已经幂了 \(x\) 次,将当前矩阵再乘以初始矩阵相当于先将算出 \(\sum_{j=2}^{\min{(i,m)}}dp[i-j]\times 2f[j][0]\ \small{(j\text{只取偶数})}\) ,然后把原矩阵右移一位,将其放在右下角。(斜着一排的 \(1\) 起到右移的作用;而求和的式子就是矩阵乘法的定义)可以发现,乘后右下角这个值这其实就是 \(dp[x+2]\) 的值。

然后用矩阵快速幂算原矩阵的 \(n/2\) 次方,得到 \(dp[2\times(n/2)]=dp[n]\) 即为答案。

T2 数数(count)

TLE 30/100 分

Description

ztxz16 从小立志成为码农,因此一直对数的二进制表示很感兴趣。今天的数学课上, ztxz16 学习了等差数列的相关知识。我们知道,一个等差数列可以用三个数 \(A,B,N\) 表示成如下形式:
\(B + A\ ,\ B + 2 \times A\ ,\ B + 3 \times A\ ,\ \cdots\ ,\ B + N \times A\)
ztxz16 想知道对于一个给定的等差数列,把其中每一项用二进制表示后,一共有多少位是 \(1\) ,但他的智商太低无法算出此题,因此寻求你的帮助。

Input

第一行输入一个整数 \(T\) 代表数据组数;
接下来T行每行输入三个整数 \(A,B,N\)

Output

输出 \(T\) 行,每行一个整数代表答案。

Sample Input

2
4 7 1
5 8 2

Sample Output

3
5

Hint

对于30% 的数据: \(1\le T\le 20 , 1\le A\le 10000 , 1\le B\le 10^{16} , 1\le N\le 10^3\)
对于60% 的数据: \(1\le T\le 20 , 1\le A\le 10000 , 1\le B\le 10^{16} , 1\le N\le 10^9\)
对于100% 的数据: \(1\le T\le 20 , 1\le A\le 10000 , 1\le B\le 10^{16} , 1\le N\le 10^{12}\)

Solution

类欧是什么东西,能吃么

\(f(a,b,c,n) = \sum\limits_{i = 0}^{n}\lfloor\dfrac{ai+b}{c}\rfloor\)

如果 \(\ a\ge c \vee b\ge c\)
\(a = k_1c +a', b = k_2c+ b'\) , \(k_1 = \lfloor\dfrac{a}{c}\rfloor,k_2 = \lfloor\dfrac{b}{c}\rfloor\)
则原式
\(= \sum\limits_{i = 0}^{n}\lfloor\dfrac{a'i + b'}{c}\rfloor + \sum\limits_{i = 0}^{n}i\lfloor\dfrac{a}{c}\rfloor + \sum\limits_{i = 0}^{n}\lfloor\dfrac{b}{c}\rfloor\)
\(= \sum\limits_{i = 0}^{n}\lfloor\dfrac{a'i + b'}{c}\rfloor + \dfrac{n(n+1)}{2}\lfloor\dfrac{a}{c}\rfloor + (n+1)\lfloor\dfrac{b}{c}\rfloor\)
\(= f(a',b',c,n) + \dfrac{n(n+1)}{2}\lfloor\dfrac{a}{c}\rfloor + (n+1)\lfloor\dfrac{b}{c}\rfloor\)

如果 \(\ a<c\ \wedge\ b<c\)
\(\ m = \lfloor\dfrac{an+b}{c}\rfloor\)
则原式
\(= \sum\limits_{i = 0}^{n}\sum\limits_{j=1}^{m}[j \le\lfloor\dfrac{ai+b}{c}\rfloor]\)
\(= \sum\limits_{i = 0}^{n}\sum\limits_{j=0}^{m - 1}[j+1 \le\lfloor\dfrac{ai+b}{c}\rfloor]\)
\(= \sum\limits_{i = 0}^{n}\sum\limits_{j=0}^{m - 1}[j+1 \le\dfrac{ai+b}{c}]\)
\(= \sum\limits_{i = 0}^{n}\sum\limits_{j=0}^{m - 1}[c(j+1)\le ai+b]\)
\(= \sum\limits_{i = 0}^{n}\sum\limits_{j=0}^{m - 1}[ai\ge cj+c-b]\)
\(= \sum\limits_{i = 0}^{n}\sum\limits_{j=0}^{m - 1}[ai> cj+c-b -1]\)
\(= \sum\limits_{i = 0}^{n}\sum\limits_{j=0}^{m - 1}[i>\lfloor\dfrac{cj+c-b -1}{a}\rfloor]\)
\(= \sum\limits_{j = 0}^{m-1}(n -\lfloor\dfrac{cj+c-b -1}{a}\rfloor)\)
\(= nm - \sum\limits_{j = 0}^{m-1}(\lfloor\dfrac{cj+c-b -1}{a}\rfloor)\)
\(= nm - f(c,c-b-1,a,m-1)\)

所以我们很容易可以很快用递归求出 \(f(a,b,c,n)\) 的值,时间复杂度为 \(O(\log N)\)

再观察题目中,要求二进制数里 \(1\) 的个数,我们可以转换一下,写出一个公式
\(ans=\sum\limits_{i=0}^{63}\sum\limits_{j=1}^{N}(\lfloor\dfrac{B+A\times i}{2^{i}}\rfloor \mod 2)\)
\(=\sum\limits_{i=0}^{63}\sum\limits_{j=1}^{N}(\lfloor\dfrac{B+A\times i}{2^{i}}\rfloor -\lfloor\dfrac{B+A\times i}{2^{i+1}}\rfloor\times 2)\)
\(=\sum\limits_{i=0}^{63}(f(A,B,2^i,N)-f(A,B,2^{i+1},N)\times 2)-\sum\limits_{i=0}^{63}\lfloor \dfrac{B}{2^i}\rfloor \mod 2\)
\(=\sum\limits_{i=0}^{63}(f(A,B,2^i,N)-f(A,B,2^{i+1},N)\times 2-\lfloor \dfrac{B}{2^i}\rfloor \mod 2)\)

然后调用写好的 \(f\) 函数就行了。





GCD

gcd

最正常的欧几里得算法,求最大公约数
\(gcd(a,b)=gcd(b,a\ mod\ b)\)

证明:
\(gcd(a,b)=d\)
\(a=dx\ ,\ b=dy\)
\(\because gcd(a,b)=d\)
\(\therefore gcd(x,y)=1\)
\(\therefore gcd(y,x\ mod\ y)=1\)
\(\therefore gcd(b,a\ mod\ b)=gcd(dy,dx\ mod\ dy)=d\)

扩展 gcd

已知 \(ax+by=gcd(a,b)\) ,求一组满足条件的 \(\{x,y\}\)
\(exgcd(b,a\ mod\ b)=\{x,y\}\)
则 $exgcd(a,b)={y\ ,\ x-\lfloor a/b\rfloor\times y} $

证明:
\(gcd(a,b)=gcd(b,a\ mod\ b)=d\)
\(\therefore bx+(a\ mod\ b)y=d\)
\(\therefore ay+b(x-\lfloor a/b\rfloor\times y)\)
\(=ay-\lfloor a/b\rfloor\times by+bx\)
\(=(a-\lfloor a/b\rfloor)y+bx\)
\(=(a\ mod\ b)y+bx\)
\(=d\)

类欧

\(\sum\limits_{i = 0}^{n}\lfloor\dfrac{ai+b}{c}\rfloor\)

上文已详述。

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