codeforces 1610D
1 good子序列的性质挖掘
1.1
对一个序列{bi},每个元素bi对应一个等差数列{x,x+1,x+2,...,x+bi−1},很显然该数列由首项x唯一确定,其和为xbi+bi(bi−1)2
因此good序列满足n∑i=1xbi+bi(bi−1)2=0,即n∑i=1xibi=n∑i=1bi(1−bi)2。
如何判断一个序列是不是good?根据上述推导,一个序列good等价于该关于x1,x2,...,xn的一次方程存在一组整数解。
根据裴蜀定理,该方程有整数解等价于gcd(b1,b2,...,bn)|n∑i=1bi(bi−1)2。这就是判断一个序列是否为good的充要条件。
以上都是很普通的数学推导。
1.2
记f(a)=a(a−1)2。
注意到如下事实:当a为奇数时,f(a)=a−12⋅a,此时a∣f(a),因此f(a)%gcd(a,.,.,...)=0.换句话说,当一个a为奇数时,它在式n∑i=1ai(ai−1)2%gcd(a1,a2,...,an)(记为式X)中对和式n∑i=1ai(ai−1)2的贡献为0,即无任何影响,而偶数情况则比较复杂。接下来我们抛开奇数的情况。
进一步地,我们知道任意整数a都能表示成2b⋅c的形式,其中b为非负整数,c为奇整数。因为上面我们抛开了奇数的情况,此时b总是正整数。此时gcd(a1,a2,...,an)=2min{b1,b2,...,bn}⋅gcd(c1,c2,...,cn)。因此式X可以表示为n∑i=12bici(2bici−1)2%2min{b}⋅gcd{c}。
1.3
单独拿出式X的每一项来看,每一项可以写成2bi−1ci(2bici−1)%2min{b}⋅gcd{c}。显然,当bi−1≥min{b}时,该式恒为0。
剩下的只有bi=min{b}的情况了,这时为2bi−1⋅ci(2bici−1)%2bi⋅gcd{c}。
抽象一下这个:设a为正整数,b,c为正奇数且c∣b,则该式为b⋅2a−1%c⋅2a。
通过观察(找规律),我们可以发现有b⋅2a−1%c⋅2a=c⋅2a−1恒成立。接下来我们尝试证明它:
等价于证明b\cdot 2^{a-1}\equiv c\cdot 2^{a-1}(\mod c\cdot2^a)。设b=x\cdot c,即证x\cdot c\cdot 2^{a-1}\equiv c\cdot 2^{a-1}(\mod c\cdot 2^a)。其中x为正奇数。
还是不够明显,再抽象一下:设y=c\cdot 2^{a-1}(1.2节提到任意整数a都能表示成2^b\cdot c的形式,这反过来也是正确的,即a与(b,c)构成的这一映射为一一映射,这条定理保证这一设的合理性),即证x\cdot y\equiv y(\mod 2y)。对正奇数x,归纳法易证其正确性。
证明完毕之后,我们就知道了当b_i=min\{b\}时,设模数为m,该项对和式的贡献为\frac{m}{2},也就是说每两个满足b_i=min\{b\}的项加起来就为0。
以上推导足够我们完成这题了。
2 如何计good子序列数
很显然,枚举min\{b\}即可,选取的方案要保证:
- 存在b_i=min\{b\}的项,且项数为偶数;
- 其他项的b_i需大于min\{b\}。
注意考虑奇数的情况:min\{b\}=0时无需保证项数为偶数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?