Codeforces Round #736 (Div. 2)
D. Integers Have Friends
题意
给定一个正整数数列 {an},它的连续子数列为 al…ar
求一个最长的连续子数列,∃m⩾2,使 al≡al+1≡…≡ar(modm),也就是它们在模 m 的意义下同余
n⩽2⋅105,ai⩽1018
思路
可以从同余的定义上思考,a≡b(modm)⟺m∣(a−b)
于是我们就可以写出上面同余式的等价式:m∣(al−al+1),…,m∣(ar−ar−1)m⩾2
进一步有:m∣gcd(al−al+1,…,ar−ar−1)m⩾2
我们可以将 m 直接取成它们的最大公约数
则当 gcd(al−al+1,…,ar−ar−1)⩾2 时,一定存在 m 满足题意
令 bn=∣an−an1∣,下面讨论针对数列 {bn} 进行
那么问题转换为查找一个最长区间,使得这个区间的数的最大公约数大于等于 2
我们可以想想如何快速求解一个区间的最小公约数,类比求区间最小值
我们发现一个区间的最小公约数也是具有可拆分性的,
也就是说 gcd(a1,a2,a3,a4)=gcd(gcd(a1,a2),gcd(a3,a4)),
于是可以利用线段树,ST表在 O(logN) 下求解任意区间的 gcd
那么我们就可以直接枚举左端点 i,然后二分最大区间长度 len,使 [i,i+len−1] 中的数 gcd⩾2
答案就是全局最大的区间长度
如果是线段树实现chk函数:时间复杂度 O(Nlog2N),二分复杂度一个 log,chk函数又一个 log
如果是ST表实现chk函数:时间复杂度 O(NlogN+Nlog1018),第一项是二分的复杂度,后一项是预处理ST表的复杂度
下面代码我是用ST表实现的
点击显/隐代码
E. The Three Little Pigs
题意
给定 n(1⩽n⩽106) ,有 Q(1⩽Q⩽2⋅105) 次询问
每次询问给出一个 x(1⩽x⩽3n),对于每个 x 求解∑i=0n(x3i)的值
注:默认当 n<m 时,(mn)=0
思路
法一
由于 ∑i=0n(x3i) 中 3i 是间断的,所以我们考虑先把它补全,以充满 [0,3n) 整个区间,这里补全的技巧很高,通过模 3 的最小剩余系中的元素将它补全
令 f(x,m)=∑i=0n−1(x3i+m)0⩽m⩽2
那么对于询问 x,ans(x)=f(x,0)+(x3n)
则有第一个方程:
f(x,0)+f(x,1)+f(x,2)=i=0∑3n−1(xi)=(x+13n)
这里使用了曲棍球恒等式(Hockey Stick Identity),由于这个数字选择在杨辉三角中的形状像一个曲棍球,也应此得名
Hockey Stick Identity:n⩾r,i=r∑n(ri)=(r+1n+1)
然后我们又可以通过二项式递推式 (mn)=(mn−1)+(m−1n−1) 得到另外两个方程:
f(x,1)=f(x,0)+f(x−1,0)f(x,2)=f(x,1)+f(x−1,1)
通过这三个方程组的联立,解得
⎩⎪⎪⎨⎪⎪⎧f(x,0)=31⋅((x+13n)−2f(x−1,0)−f(x−1,1))f(x,1)=f(x,0)+f(x−1,0)f(x,2)=f(x,1)+f(x−1,1)
于是就可以愉快的递推了
注意:一定要 O(n) 预处理组合数,3−1 也要预处理,不然 ⌊log2109⌋=29 这个常数可不小
O(n) 预处理方法可以见代码
大致思路是先求 1!…n!,再求 (n!)−1,最后通过 ((n−1)!)−1=(n!)−1⋅n 线性求出每个阶乘的逆元
总复杂度 O(6N+Q)
点击显/隐代码
法二
利用多项式系数,直接构造答案
令多项式 P(k)=(1+k)3+(1+k)6+…+(1+k)3n
那么对于询问 x,ans(x) 就是 kx 的系数
问题转换为解救 P(k) 多项式,如果用FFT还是会超时,再观察可以看出来它是一个等比数列求和
利用等比数列求和公式,先消去常数项,然后上下项同时除以 k,得
P(k)=(1+k)3−1(1+k)3n+3−(1+k)3=k3+3k2+3kk3n+3+…+(3n+3)k−k3−3k2−3k=k2+3k+3k3n+2+…+(3n+3)−k2−3k−3
那么问题转换为:多项式长除法,直接模拟这个过程即可,同样需要预处理组合数,降低复杂度
时间复杂度 O(3N+Q)
点击显/隐代码
F1. Gregor and the Odd Cows (Easy)
题意
给出 n 个栅栏柱,每个栅栏柱的坐标都是整数并且保证是偶数,三个栅栏柱可以围成一个封闭三角形,被封闭三角形所包围的节点数为奇数个,并且要求三角形的面积为整数,求一共有多少种这样的三角形。
前置芝士
Pick定理
在网格图上的简单多边形的面积 S 有如下公式
S=a+2b−1
其中,a 为网格中在多边形内部的节点数,b 为多边形边上的格点数
证明:维基百科 Pick’s theorem
Shoelace公式 (鞋带公式)
令简单多边形的顶点坐标分别为 (xi,yi)i=1…n
则,该简单多边形的面积为:
S=21∣∣∣∣∣i=1∑ndet(xixi+1yiyi+1)∣∣∣∣∣=21∣∣∣∣∣i=1∑nxiyi+1−xi+1yi∣∣∣∣∣xn+1=x1,yn+1=y1
这个我是用外积理解的(内部的行列式),具体证明:维基百科 Shoelace formula
它就像的计算关系就像“系鞋带”一样
思路
如果没有Pick定理真的一点思路都没有
由于题目保证了坐标都是偶数,则由Shoelace公式(外积求三角形面积)知,三角形的面积一定是整数,并且是偶数
题目又要求内部点的个数为奇数,再通过Pick定理 S=a+2b−1=a−1+2b,则 a 为奇数,故 a−1 为偶数
进一步有:2(S−(a−1))=b⟺b≡0(mod4)
于是问题就转换为求解三角形的边上格点数目为4的倍数
我们考虑 AB 这条边,A(x1,y1),B(x2,y2)
则这条边上的格点数目一定为 gcd(∣x1−x2∣,∣y1−y2∣)+1,可以通过画简单的示意图得出
则
b=i=1∑3(gcd(∣xi−xi+1∣,∣yi−yi+1∣)+1)−3=i=1∑3gcd(∣xi−xi+1∣,∣yi−yi+1∣)≡0(mod4)x4=x1,y4=y1
于是,问题可以转换为mod4 意义下,将所有的 x,y 坐标都对4取模,然后求满足上式的方案数
又由于 x,y 都是偶数,所以 x,y≡0 or 2(mod4)
所以模4意义下的坐标一共也就4种,可以直接枚举出3个坐标,然后判断是否满足上式,统计答案,就OK了
时间复杂度 O(N+43)
点击显/隐代码