Codeforces Round #841 (Div. 2) and Divide by Zero 2022
A - Joey Takes Money
给一个长度为 n 的整数序列 ai≥1
选择两个数 ai 和 bi,将其替换为 x, y,其中 x∗y=ai∗aj,这个操作可以进行无数次
输出这个序列的和乘以2022
直接暴力就行:
B - Kill Demodogs
一个矩阵,从 (1,1) 出发走到 (n,n),每经过(i,i)可得分i∗i。 只能向下或者向右走
问全程最大积分是多少?
首先根据 a+b≥2ab,当 a=b时,a∗b取最大,所以移动路线应该是这样的:
当我们走到(1,1)时,获得积分 a1=1∗1
从第一行走第二行,获得积分 a2=2∗2+2∗1
以此类推,当我们走完 n 行时,获得积分 an=n2+n(n−1)
走到 (n,n),即求数列 an 前 n 项的和 Sn=6n(4n−1)(n+1)
本来当存在取模时,除法要求逆元,但是正好题目要求答案乘以 2022,所以最终答案是 Sn=337n(4n−1)(n+1)
C - Even Subarrays
给一段长度为 n 的序列 ai,从中找到他的连续子序列,并且这个连续子序列的因数个数为偶数。
问这样的子序列个数为多少
首先一个数的因子都是成对出现的,当这个数是平方数的时候会出现两个一样的因子,也就是说当
一个数不是平方数的时候,它的因子个数一定是偶数个。
因此我们只需要判断有多少个子区间的异或和为平方数,最后用子区间的个数减去子区间中异或和为平方数的个数即可。
这个统计操作有一个相似的题目: Crazy Binary String,
D - Valiant’s New Map
二分+二维前缀和
应该有别的思路
题目给一个 n×m 的矩阵,从里面选择 l×l 的子矩阵,并且这个子矩阵的元素最小值必须不小于 l
从 l∈[1,min(n,m)] 中二分 l,check函数用二维前缀和即可。
能卡着时间跑过。