A - 求递推序列的第N项
矩阵快速幂,帮助大家搭建/测试自己的模板。
简单地讲一下原理,可以看到每一项用到了前两项的值,首先构造一个二维的向量$\left(\begin{matrix}
f(i-1) \\
f(i-2) \\
\end{matrix}\right)$,如果有常数就再加一维。那么将这个向量作为自变量,下一项就是$\left(\begin{matrix}
f(i) \\
f(i-1) \\
\end{matrix}\right)$。最后稍微动一下脑子配一个$2\times2$的系数矩阵使得$Cx_{i-1}=x_{i}$:
$$\left(\begin{matrix}
A & B \\
1 & 0 \\
\end{matrix}\right)
\left(\begin{matrix}
f(i-1) \\
f(i-2) \\
\end{matrix}\right)
=\left(\begin{matrix}
f(i) \\
f(i-1) \\
\end{matrix}\right)$$
复杂度$O(M^3logN)$,其中$M$为矩阵的大小,等于$2$。
1 |
|
B - Kinds of Fuwas
题意:四个角为同一种福娃的子矩形有多少个?
题解:从样例可以看出,一行或一列的矩形都不算。从数据范围来看,直接四个循环复杂度太高了,但是每个元素的值域很小,只有五个种类,所以可以考虑枚举每个种类来做。对于每个种类,比如H,我们可以利用类似最大子矩阵的套路,枚举两行作为上下界,然后再枚举每一列,对上下都是H的列进行计数,在这之中任取两列就是符合要求的矩形,所以把答案加上$C^{2}_{m}$即可,这个组合数可以$O(1)$求得。
复杂度$(KM^2N)$,其中$K$等于$5$。
1 |
|
C - GCD is Funny
题意:
在黑板上写有$n$个数,每次删掉$a,b,c$三个数并把$d$写两遍,$d$可以是$(a,b),(a,c),(b,c)$。在$n-2$次操作后会留下两个相同的数,输出这个数的所有可能情况。
题解:
这个题很难虽然出在某一场BC的A题。
首先要思考一下脱离具体过程,这个数到底是什么。题中的过程以下简称为“擦黑板”。
- 如果已经存在两个相同的数$x$,再取一个数$y$进行一次擦黑板,那么可以令$d=(x,x)=x$,剩下的数为$x,x$。可以发现$y$没有产生影响,两个$x$直接“吃掉”了$y$;
- 由1,我们可以单独考虑每一个$size\ge 3$的子集,它的结果一定是两个相同的数,其他的数直接吃掉就好。为了保证枚举的不重不漏,该子集内应该有尽量多的数参与$gcd$运算(注意,参与擦黑板$\neq$参与$gcd$运算),也就是$size-1$个数。因为第一次擦黑板一定有一个数无法参与$gcd$运算,而从第二次开始,有前一次得到的两个数$x$,再取一个数$y$进行一次擦黑板,那么可以令$d=(x,y)$,$y$一定能参与$gcd$运算。


