【题解】四川大学第二届SCUACM新生赛
A-丁姐姐喜欢Fibonacci
由偶数+奇数=奇数,奇数+奇数=偶数
易得Fibonacci数列的奇偶规则为:奇奇偶奇奇偶奇奇偶.……
对于每一项,模3后直接输出结果即可
B-丁姐姐喜欢LCS
C-俏兔子大战傻贼鹰-Easy Version
判断有无定缺牌,统计每张牌出现的次数,判断是否有7对一样的牌,四张一样的可以算两对,或者考虑有一对一样的,和四坎牌(三张一样的),其余情况不能胡牌。
数据比较小,时间复杂度为
代码点击此处链接查看~
D-俏兔子大战傻贼鹰-Hard Version
贪心的模拟一下就好了,先判断有无定缺,然后7对子,然后平胡可以考虑先把一对的牌确定,然后剩下的牌,对于第张牌只有一张我们肯定只能做顺子,如果有两张我们也只能做两对顺子,有三张则不做顺子。四张其实是一张和三张的组合情况。
E-【模板】欧拉筛
通过情况:
于是我们可以首先通过欧拉筛(或者埃氏筛也行,其实速度影响不是很大)筛出1e5以内的质数并作上相应标记,然后对于每个P,枚举|1,P-11范围内的数,同时计算其阶乘模P后的值,如果当前枚举的数x是一个质数,将x!%P累加进答案即可。
SCUoJ运行时间:1060ms占用内存:904KB
F-【模板】后缀自动机
题目描述
给定两个字符串s和T,问你S中是否存在一个后缀P,使得T的任何一个前缀的字典序都大于P。
题解
很明显S的后缀P应该小于字典序最小的前缀,很明显T最小的前缀就是第一个字符,要使P比他小,只能P的第一个字符比他小,所以实际上就检查一下是否 S[i]< T[0]
G- 走迷宫
容易发现,这样走迷宫总是一圈一圈地走的。
我们用二分的方法求出第 k 步位于哪一圈,然后在这一圈上用 if-else 判断位于哪一条边即可。
而二分的方法,大概就是,设一个 n*m 区域的最外圈为第 1 圈,那么第 x 圈就已经走过了前 x-1 圈,就已经走过了 n*m-(n-2*(x-1))*(m-2*(x-1)),判断这个数与 k 的大小关系即可。
由于每一圈都会导致两边各减 2 ,因此最大圈数为 min((n+1)/2,(m+1)/2)。
H- 捡金币
序列中一段元素的和可以由前缀和相减得到,即用 表示序列中前 i 个元素的和,那么第 x 个元素到第 y 个元素的和可以表示为 。
推广到矩阵,用二维前缀和 表示以 (1,1) 为左上角,(i,j) 为右下角的子矩阵的和。那么稍微应用一下容斥原理,一个以 (a,b) 为左上角,(c,d) 为右下角的子矩阵的和可以表示为 。
回到这个问题上,容易发现需要求和的是一个旋转 45 度后的正方形区域。
Solution.1
大概就是以某个点为下顶点的无限大三角形区域。
那么在忽略细节的情况下,题目中的一组询问 (x,y,k) 就可以表示为 sum[x+k][y]-sum[x][y-k]-sum[x][y+k]+sum[x-k][y] ,只不过这样会导致菱形区域的两条边被减掉,因此我们还需要用两个前缀和 sum2[i][j] 和 sum3[i][j] (具体意义参考下图中的黄色(sum2)与蓝色(sum3)区域)来把这两条被减掉的边给加回来。
最后的式子就是
sum[x+k][y]-sum[x][y-k]-sum[x][y+k]+sum[x-k][y]
+sum2[x][y-k]-sum2[x-k][y]
+sum3[x][y+k]-sum3[x-k][y]+num[x-k][y]
最后再考虑一个细节,就是这个式子中,如果出现越界的情况,那我们需要找一个合法的等效替代点,很好找,找法参考代码。
思路都是很暴力的,只不过细节稍多一点。
单组数据时间复杂度
把给出的矩阵旋转 45 度后存储,以下面这个 3*3 的矩阵为例:
1 2 3 4 5 6 7 8 9旋转 45 度后存储为:
- - 3 - - - 2 - 6 - 1 - 5 - 9 - 4 - 8 - - - 7 - -在这个新矩阵里直接用普通的矩阵二维前缀和求子矩阵和的方式就可以了。
具体的旋转方式不唯一,能保证最后转了 45 度就行。
单组数据时间复杂度也是
I- 排序
J- n=a*b*c
K- 梅森素数
首先和大家道歉,因为我的失误然后手抖把3写成2呢。我有罪。后面也没认真写代码去验题。
首先我们分析梅森数的形式,当n为偶数的时候,显然可以通过平方差公式因式分解,所以可以得出,当n为偶数的时候,这个梅森数一定不是梅森素数。
L- 双流机场
因为题目要求询问是否任意两点能够互相到达。实际上就是求是否所有的点处在同一个强连通中。
题目中点的数量是量级的,简单的tarjan算法显然不能通过本题。(如果是大一的新生,可以稍微百度一下这个算法。但是不用深入学习。)
M- lglg说要有题,于是便有了题
这个题目胆子大一点直接打表,发现最后都是3直接交就好了。。。
然后我们分析为什么这样是正确的呢?因为我题目中说的质数的分布我们知道质数实际上是很稀疏的。我们大概估计一下大概多少个数之中又一个数是质数,然后我们本机计算一下大概到