CF1808E3 题解

· · 题解

仍然考虑反面,即 $2a_i\not\equiv S\pmod k$。 先枚举 $S$,根据 $k$ 的奇偶性分类讨论: ① $k\equiv 1 \pmod 2$。 此时,不满足上述那个同余方程的数只有一个并且可以解出来,记为 $t$。显然可以容斥了。设 $f(i)$ 表示**钦定** $i$ 个位置的值为 $t$ 的方案数,$g(i)$ 表示**恰好** $i$ 个位置的值为 $t$ 的方案数。则 $f(i)=\sum\limits_{j=i}^nC_j^ig(j)$。我们要求 $g(0)$。 直接二项式反演得到 $g(i)=\sum\limits_{j=i}^n(-1)^{j-i}C_j^if(j)$。带入 $i=0$ 即得 $g(0)=\sum\limits_{i=0}^n(-1)^if(i)$。 再考虑直接计算 $f(i)$。当 $i=n$ 时 $f(i)=[nt\equiv S \pmod k]$,否则容易发现,剩余的 $n-i$ 个位置中的 $n-i-1$ 个位置可以随便选,而由于和一定因此最后一个位置可以自动确定。因此,$f(i)=C_n^ik^{n-1-i}$。 由于 $i=n$ 的情况略有不同,因此将其分离出来。带入: $g(0)=\sum\limits_{i=0}^{n-1}(-1)^iC_n^ik^{n-1-i}+(-1)^nf(n)$。 左边那个式子是个类似二项式定理的形式。将其分离一下略作调整即可化简为如下形式: $g(0)=\frac{(k-1)^n-(-1)^n}{k}+(-1)^nf(n)$。 注意到这个是建立在枚举 $S$ 的基础上的,所以将 $f(n)$ 写为 $f_{S}(n)$。将其对 $0\le S\le k-1$ 累加求和即可得到这部分的答案为 $(k-1)^n-(-1)^n+(-1)^n\sum\limits_{i=0}^{k-1}f_i(n)$。再利用 $t$ 的定义即可得到 $f_i(n)=[(n-2)i\equiv 0 \pmod k]$。这样的 $i$ 显然有 $\gcd(n-2,k)$ 个。 带入,并注意这是反面情况,即可得到这部分的答案为 $k^n-(k-1)^n+(-1)^n-(-1)^n\gcd(n-2,k)$。 ② $k\equiv 0\pmod 2

此时发现,当 S 为奇数时显然无解。考虑统计 S 为偶数且不包含满足 2a_i\equiv 0\pmod ka_i 的方案。

和上一种情况不同的是,此时不满足条件的数有两个,记为 t_1,t_2。且可以解出这两个值,分别为 \frac{S}{2},\frac{S+k}{2}

仍然容斥。设 f(i) 表示钦定 i 个值为 t_1t_2 的方案数。g(i) 表示恰好 i 个值为 t_1t_2。所求即为 g(0)

显然 f(i)=\sum\limits_{j=i}^nC_j^ig(j)。二项式反演得到 g(i)=\sum\limits_{j=i}^nC_j^i(-1)^{j-i}f(j)。带入得到 g(0)=\sum\limits_{i=0}^n(-1)^if(i)

考虑计算 f(i)。当 i\ne n 时,可得 f(i)=C_n^i2^ik^{n-1-i}。否则记为 f_S(n),稍后处理。

类似于上面的情况,对偶数 S 累加求和即得

\frac{(k-2)^n-(-2)^n}{2}+(-1)^n\sum\limits_{S=2t,0\le 2t<k}f_S(n)

考虑计算 f_S(n)。枚举其中有 jt_1n-jt_2。则 f_S(n)=\sum\limits_{j=0}^nC_n^j[jt_1+(n-j)t_2\equiv0\pmod k]

代入 t_1,t_2 表达式,化简为:

f_S(n)=\sum\limits_{j=0}^nC_n^j[\frac{k}{2}j\equiv \frac{S+k}{2}n-S\pmod k]

注意到,\frac{k}{2}jk 的值只可能为 0\frac{k}{2},而右边是定值。发现无论是哪种情况,都是组合数上指标的交换求和,其值均为 2^{n-1}

\frac{S+k}{2}n-S\equiv 0\pmod \frac{k}{2}。因此有 \frac{S}{2}(n-2)\equiv 0\pmod \frac{k}{2}。这种式子再熟悉不过了,满足条件的 S\gcd(n-2,\frac{k}{2}) 个。

综上,我们得到:\sum\limits_{S=2t,0\le 2t<k}f_S(n)=2^{n-1}\gcd(n-2,\frac{k}{2})

同样注意这是反面情况。整理可得这部分的答案为

\frac{k^n-(k-2)^n+(-2)^n}{2}-(-1)^n2^{n-1}\gcd(n-2,\frac{k}{2})

时间复杂度为 O(\log n+\log k)。注意 2 关于模数的逆元有可能不存在,需要通过微操避免除法。(具体的,就是把一个 k 拆开除以 2)。代码。