这题根本不是递归,因为你第一项都不知道是什么。
可以设每次操作为$p(a, -b)$,首项可以设为$x$,那么要满足的等式为
$$
\begin{aligned}
x + (x+p) + (x+2p) + \dots + (x+(n-1)*p) &= s \\
nx + [ p + 2p + \dots + (n-1)*p ] &= s \\
\frac{s - [ p + 2p + \dots + (n-1)*p ]}{n} &= x \\
\end{aligned}
$$
等价于求以下两个等式
$$
\begin{aligned}
\frac{s - [ p + 2p + \dots + (n-1)*p ]}{n} &= x \\
[s \% n - [ p + 2p + \dots + (n-1)*p ] \% n] \%n &= 0
\end{aligned}
$$
$ap\% n$记为$k_{a+1}$,于是有(这里的$k_{1}=0$)
$$
(k_{1} + k_{2} + \dots + k_{n}) \% n = s \% n
$$
用二维dp来表示
dp[i][j] 代表计算前i个k,j代表sum(ki) % n = j,其中dp[i][j]存储方案数量
那么dp[1][0] = 1
代表的意思就是
只考虑第1项,它的余数为0=j,且方案数量只有1(因为k1 = 0)
然后我们考虑一下,假如说第i项选择了+a的操作,那么它对i+1之后的序列造成的影响总和为$sum_a = (n-i+1)\times a \mod n$,相似的对于-b操作,$sum_b = (n-i+1) \times b \mod n$
那么相应的状态转移方程(可以理解为第i项选择了+a或者-b)
dp[i][j] = dp[i-1][(j - sum_a)%n] + dp[i-1][(j + sum_b)%n]
最终答案自然是前n项,余数为0的情况即dp[n][s%n]
还需要注意的是,要得到正确的余数(要考虑负数)
mod(x, y):
return (x % y + y) % y